Quelle est la différence? Quand devrais-je utiliser quoi? Pourquoi y en a-t-il autant?
Quelle est la différence? Quand devrais-je utiliser quoi? Pourquoi y en a-t-il autant?
Réponses:
kind_of?
et is_a?
sont également synonymes.
instance_of?
est différent des deux autres en ce qu'il ne retourne que true
si l'objet est une instance de cette classe exacte, pas une sous-classe.
Exemple:
"hello".is_a? Object
et "hello".kind_of? Object
retourner true
car "hello"
est un String
et String
est une sous-classe de Object
."hello".instance_of? Object
revient false
.@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 pas is_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 remplacer is_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.
Quelle est la différence?
De la documentation:
- - ( booléen )
instance_of?(class)
- Renvoie
true
ifobj
est une instance de la classe donnée.
et:
- - ( booléen )
is_a?(class)
- ( booléen )kind_of?(class)
- Renvoie
true
ifclass
est la classe deobj
, ou siclass
est l'une des superclassesobj
ou des modules inclus dansobj
.
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.
Quand devrais-je utiliser quoi?
Jamais. Utilisez plutôt le polymorphisme.
Pourquoi y en a-t-il autant?
Je n'appellerais pas deux "beaucoup". Il y en a deux, car ils font deux choses différentes.
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.
Je n'appellerais pas non plus deux beaucoup ( is_a?
et kind_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:
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?
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.