Was ist der Unterschied? Wann soll ich welche verwenden? Warum gibt es so viele von ihnen?
Was ist der Unterschied? Wann soll ich welche verwenden? Warum gibt es so viele von ihnen?
Antworten:
kind_of?
und is_a?
sind auch.
instance_of?
unterscheidet sich von den beiden anderen darin, dass es nur zurückgibt, true
wenn das Objekt eine Instanz dieser exakten Klasse und keine Unterklasse ist.
Beispiel:
"hello".is_a? Object
und "hello".kind_of? Object
kehre zurück, true
weil "hello"
es ein String
und String
eine Unterklasse von ist Object
."hello".instance_of? Object
Gibt jedoch zurück false
.@honda.kind_of? Car
und @person.is_a? Administrator
Ruby dreht sich alles um die Ästhetik. Beachten Sie in der Tat den Grammatikfehler ... mit aktiver Unterstützung können Sie schreiben @person.is_an? Administrator
:) ... Das könnte es inzwischen tatsächlich in Ruby Core geschafft haben.
kind_of?
aber nicht überschreiben is_a?
?
is_an?
ist nicht in Ruby-1.9.2-p0. @Claudiu, nein. is_a?
ist nur ein Alias vonkind_of?
. Beide Methoden rufen dieselbe c-Funktion auf rb_obj_is_kind_of
.
kind_of?
ohne zu überschreiben is_a?
.
is_an?
Methode ?! Es ist nicht in der aktuellen Rails-Version und ich kann bei Google auch nichts darüber finden, dass es veraltet ist.
Was ist der Unterschied?
Aus der Dokumentation:
- - ( Boolescher Wert )
instance_of?(class)
- Gibt
true
if zurück, wennobj
es sich um eine Instanz der angegebenen Klasse handelt.
und:
- - ( Boolean )
is_a?(class)
- ( Boolean )kind_of?(class)
- Gibt zurück,
true
obclass
es sich um die Klasse vonobj
handelt oder obclass
es sich um eine der in enthaltenen Superklassenobj
oder Module handeltobj
.
Wenn das unklar ist, wäre es schön zu wissen, was genau unklar ist, damit die Dokumentation verbessert werden kann.
Wann soll ich welche verwenden?
Noch nie. Verwenden Sie stattdessen Polymorphismus.
Warum gibt es so viele von ihnen?
Ich würde nicht zwei "viele" nennen. Es gibt zwei von ihnen, weil sie zwei verschiedene Dinge tun.
Es ist eher Ruby-ähnlich, Objekte zu fragen, ob sie auf eine von Ihnen benötigte Methode reagieren oder nicht respond_to?
. Dies ermöglicht sowohl eine minimale Schnittstelle als auch eine Implementierung ohne Kenntnis der Programmierung.
Es ist natürlich nicht immer anwendbar, daher besteht immer noch die Möglichkeit, mit den von Ihnen gewünschten Methoden nach einem konservativeren Verständnis von "Typ" zu fragen, bei dem es sich um eine Klasse oder eine Basisklasse handelt.
Ich würde auch nicht zwei viele nennen ( is_a?
und kind_of?
Aliase derselben Methode sind), aber wenn Sie mehr Möglichkeiten sehen möchten, wenden Sie sich der #class
Methode zu:
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?
undkind_of?
existiert: Ich nehme an, es ist Teil von Rubys Designphilosophie. Python würde sagen, dass es nur einen Weg geben sollte, etwas zu tun; Ruby hat oft auch Methoden, so dass Sie die verwenden können, die besser klingt. Es ist eine Frage der Präferenz. Dies kann teilweise auf den japanischen Einfluss zurückzuführen sein: Mir wurde gesagt, dass sie je nach Satz ein anderes Wort für dieselbe Nummer verwenden werden, damit es besser klingt. Matz hat diese Idee möglicherweise in sein Sprachdesign übernommen.