Der Empfänger ist A in A.medhod (B). Es scheint, dass sich vor der Methode kein Empfänger befindet. Zum Beispiel in den folgenden Fällen.
class ClassA
def say
puts instance_of? String #false
puts instance_of? ClassA #true
end
end
ClassA.new.say
#false
#true
instance_of? [Ruby] Unterschied zwischen is_a? Und instance_of? Wie ich in der Erklärung von geschrieben habe
A.instance_of? B
An einem Punkt ist A eine Instanz von B, aber im obigen Beispiel gibt es kein "A".
Zusammenfassend geht der Instanz von oben eine Instanz der Klasse A voraus. Wenn Sie auf eine Methode derselben Klasse, Vererbungsklasse oder eines enthaltenen Moduls verweisen, muss der Methode keine Instanz vorangestellt werden (stellen Sie sich vor, dass sie automatisch angehängt wird). Nachtrag: Ich erhielt den Kommentar, dass "es eine Regel gibt, dass self der Empfänger für Methodenaufrufe ist, die den Empfänger nicht explizit schreiben", aber ich denke, diese Denkweise ist leichter zu verstehen.
In den folgenden Fällen beispielsweise
class ClassB
def say_b
say_b2
end
def say_b2
puts "bbb"
end
end
ClassB.new.say_b
# bbb
Das fühlt sich nicht seltsam an, oder? Methoden derselben Klasse können mit anderen Methoden ausgeführt werden, ohne einen Empfänger zu schreiben (oder nicht zu schreiben). In ähnlicher Weise ist die obige instance_of? -Methode tatsächlich eine Methode der Object-Klasse der Oberklasse (genau genommen scheint es sich um eine Methode des in der Object-Klasse enthaltenen Kernel-Moduls zu handeln).
ClassA.new.method(:instance_of?).owner
=> Kernel
Vielleicht war der Grund, warum ich mich unwohl fühlte, als die erste Instanz von plötzlich auftauchte, der, dass ich die Beziehung zwischen der Instanz von Methode und Klasse A nicht sehen konnte.
Sie können auch den Empfänger überprüfen.
method(:Methode).receiver
Sie können mit ausgeben.
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>
Sie können sehen, dass der Empfänger von say_b2 eine Instanz von ClassB ist. Tatsächlich gibt es bereits eine Instanz von ClassB vor der Methode (: say_b2).
Recommended Posts