回答:
kind_of?とis_a?同義です。
instance_of?他の2つとは異なりtrue、オブジェクトがサブクラスではなく、その正確なクラスのインスタンスである場合にのみ返されます。
例:
"hello".is_a? Objectそして、"hello".kind_of? Objectリターンtrueために"hello"あるStringとStringのサブクラスですObject。"hello".instance_of? Object返しますfalse。@honda.kind_of? Carと@person.is_a? Administrator、美学についてRubyのすべて。実際、文法エラーに注意してください...アクティブなサポートを使用して、次のように書くことができます@person.is_an? Administrator:)...実際には、Rubyコアになっている可能性があります。
kind_of?なくis_a??
is_an?ruby-1.9.2-p0 にはありません。@Claudiu、いいえ。is_a?はの単なるエイリアスですkind_of?。どちらのメソッドも同じc関数を呼び出しrb_obj_is_kind_ofます。
kind_of?ことなくオーバーライドできますis_a?。
is_an?メソッドはどこにありますか?!現在のRailsバージョンにはないので、Googleで非推奨になることについては何も見つかりません。
違いはなんですか?
ドキュメントから:
- -(ブール値)
instance_of?(class)- が指定されたクラスのインスタンスである
trueかどうかを返しますobj。
そして:
- -(ブール)
is_a?(class)
-(ブール)kind_of?(class)- 戻り値
trueの場合は、classのクラスであるobj場合、またはclassのスーパークラスの一つであるobjかに含まれるモジュールobj。
それが不明確な場合は、正確に何が不明確であるかを知っておくと、ドキュメントを改善できます。
どちらを使用すればよいですか?
決して。代わりにポリモーフィズムを使用してください。
なぜそんなにたくさんあるのですか?
私は2つを「多く」とは呼びません。2つの異なることを行うため、2つあります。
オブジェクトを使用して、必要なメソッドに応答するかどうかをオブジェクトに尋ねるのは、Rubyに似ていますrespond_to?。これにより、最小限のインターフェイスと実装を意識しないプログラミングの両方が可能になります。
もちろん、常に適用できるとは限りません。したがって、求めているメソッドを使用して、クラスまたは基本クラスである「タイプ」のより保守的な理解について質問する可能性はまだあります。
私はまた、多くの2を呼び出す(ないだろうis_a?とkind_of?同じ方法の別名です)が、あなたはより多くの可能性を見たい場合は、あなたに注意を向ける#class方法:
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class
is_a?、kind_of?Rubyの設計哲学の一部だと思います。Pythonは、何かを行う方法は1つだけであると言っています。Rubyには多くの場合、同義のメソッドがあるため、より良い音のメソッドを使用できます。それは好みの問題です。部分的には日本の影響によるかもしれません。より良い音にするために、文によっては同じ数字に異なる単語を使用すると言われています。マッツは彼の言語デザインにその考えを持ち込んだかもしれません。