Le récepteur est A dans la méthode A. (B). Il peut apparaître qu'il n'y a pas de récepteur devant la méthode. Par exemple, dans les cas suivants.
class ClassA
def say
puts instance_of? String #false
puts instance_of? ClassA #true
end
end
ClassA.new.say
#false
#true
exemple de? [Ruby] Différence entre is_a? Et instance_of? Comme je l'ai écrit dans l'explication de
A.instance_of? B
À un moment donné, A est une instance de B, mais dans l'exemple ci-dessus, «A.» est manquant, n'est-ce pas?
En conclusion, l'instance_of? Ci-dessus est précédée d'une instance de classe A. Lorsque vous faites référence à une méthode de la même classe, classe d'héritage ou module inclus, il n'est pas nécessaire de faire précéder la méthode d'une instance (pensez qu'elle est automatiquement attachée). Addendum: J'ai reçu un commentaire disant qu '"il existe une règle selon laquelle self est le récepteur des appels de méthode qui n'écrivent pas explicitement le récepteur", mais je pense que cette façon de penser est plus facile à comprendre.
Par exemple, dans les cas suivants,
class ClassB
def say_b
say_b2
end
def say_b2
puts "bbb"
end
end
ClassB.new.say_b
# bbb
Cela ne semble pas étrange, non? Les méthodes de la même classe peuvent être exécutées à partir d'autres méthodes sans écrire (ou ne pas écrire) de récepteur. De même, la méthode instance_of? Ci-dessus est en fait une méthode de la classe Object de la superclasse (à proprement parler, elle semble être une méthode du module Kernel inclus dans la classe Object).
ClassA.new.method(:instance_of?).owner
=> Kernel
Peut-être que la raison pour laquelle je me suis senti mal à l'aise lorsque la première instance_of?
Vous pouvez également vérifier le récepteur.
method(:Méthode).receiver
Vous pouvez sortir avec.
class ClassB
def say_b
say_b2
puts method(:say_b2).receiver
end
def say_b2
puts "bbb"
end
end
ClassB.new.say_b
# bbb
# #<ClassB:0x00007ff34d8a0550>
Vous pouvez voir que le récepteur de say_b2 est une instance de ClassB. En fait, il existe déjà une instance de la méthode ClassB before (: say_b2).
Recommended Posts