Was ist der Unterschied? Wann soll ich welche verwenden? Warum gibt es so viele von ihnen?
ruby
inheritance
introspection
Claudiu
quelle
quelle
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.Antworten:
kind_of?
undis_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 einString
undString
eine Unterklasse von istObject
."hello".instance_of? Object
Gibt jedoch zurückfalse
.quelle
@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 überschreibenis_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 aufrb_obj_is_kind_of
.kind_of?
ohne zu überschreibenis_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.Aus der Dokumentation:
und:
Wenn das unklar ist, wäre es schön zu wissen, was genau unklar ist, damit die Dokumentation verbessert werden kann.
Noch nie. Verwenden Sie stattdessen Polymorphismus.
Ich würde nicht zwei "viele" nennen. Es gibt zwei von ihnen, weil sie zwei verschiedene Dinge tun.
quelle
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.
quelle
Ich würde auch nicht zwei viele nennen (
is_a?
undkind_of?
Aliase derselben Methode sind), aber wenn Sie mehr Möglichkeiten sehen möchten, wenden Sie sich der#class
Methode zu:quelle