Quelle est la différence? Quand devrais-je utiliser quoi? Pourquoi y en a-t-il autant?
ruby
inheritance
introspection
Claudiu
la source
la source
is_a?
etkind_of?
exister: je suppose que cela fait partie de la philosophie de conception de Ruby. Python dirait qu'il ne devrait y avoir qu'une seule façon de faire quelque chose; Ruby a souvent des méthodes synonymes pour que vous puissiez utiliser celle qui sonne le mieux. C'est une question de préférence. Cela peut être en partie dû à l'influence japonaise: on me dit qu'ils utiliseront un mot différent pour le même numéro selon la phrase afin de le rendre plus agréable. Matz a peut-être porté cette idée dans sa conception du langage.Réponses:
kind_of?
etis_a?
sont également synonymes.instance_of?
est différent des deux autres en ce qu'il ne retourne quetrue
si l'objet est une instance de cette classe exacte, pas une sous-classe.Exemple:
"hello".is_a? Object
et"hello".kind_of? Object
retournertrue
car"hello"
est unString
etString
est une sous-classe deObject
."hello".instance_of? Object
revientfalse
.la source
@honda.kind_of? Car
et@person.is_a? Administrator
, Ruby est tout au sujet de l'esthétique. En fait, remarquez l'erreur grammaticale ... avec un support actif, vous pouvez écrire:)@person.is_an? Administrator
... Cela aurait pu en faire maintenant dans le noyau Ruby.kind_of?
mais pasis_a?
?is_an?
n'est pas dans ruby-1.9.2-p0. @Claudiu, non.is_a?
est juste un alias dekind_of?
. Les deux méthodes Invoke la même fonction c,rb_obj_is_kind_of
.kind_of?
sans remplaceris_a?
.is_an?
méthode ActiceSupport ?! Ce n'est pas dans la version actuelle des rails, et je ne trouve rien sur google à propos de sa dépréciation non plus.De la documentation:
et:
Si cela n'est pas clair, il serait bon de savoir exactement ce qui n'est pas clair, afin que la documentation puisse être améliorée.
Jamais. Utilisez plutôt le polymorphisme.
Je n'appellerais pas deux "beaucoup". Il y en a deux, car ils font deux choses différentes.
la source
Il est plus semblable à Ruby de demander aux objets s'ils répondent à une méthode dont vous avez besoin ou non, en utilisant
respond_to?
. Cela permet à la fois une programmation minimale sans interface et sans implémentation.Bien sûr, il n'est pas toujours applicable, il est donc toujours possible de poser des questions sur une compréhension plus conservatrice du "type", qui est une classe ou une classe de base, en utilisant les méthodes que vous demandez.
la source
Je n'appellerais pas non plus deux beaucoup (
is_a?
etkind_of?
sont des alias de la même méthode), mais si vous voulez voir plus de possibilités, portez votre attention sur la#class
méthode:la source