[Ruby] Denken, wenn sich vor der Methode kein Empfänger befindet (wie es aussieht)

Hintergrund:

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".

Denkweise

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

Ursache des Unbehagens

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.

Bestätigungsmethode

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

[Ruby] Denken, wenn sich vor der Methode kein Empfänger befindet (wie es aussieht)
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Memo zur Datenerfassungsmethode, wenn HashMap in HashMap vorhanden ist
[Ruby] Gewöhnen Sie sich an, beim Erstellen einer Kopie einer Zeichenfolgenvariablen die dup-Methode zu verwenden
Wenn im Docker-Protokoll keine Ausgabe für stdout vorhanden ist
Wirf eine Ausnahme und fange, wenn es keinen Handler gibt, der dem Pfad im Frühjahr entspricht
Like-Funktion Der Teil, der feststeckt, um es asynchron zu machen
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Wenn ich die Eigenschaftendatei bearbeite, sieht es aus wie verstümmelte Zeichen
Was ist @Override oder @SuppressWarnings ("SleepWhileInLoop") vor der Funktion? ?? ??
Untersuchungsmethode, wenn die CPU des Servers, auf dem Java ausgeführt wird, schwer ist
Was ist es? ~ 3 Arten von "Nein" ~
Fehler, wenn das in SpringWebFlux verwendete Mitglied der Entity-Klasse endgültig ist
Anfangswert, wenn die Spring-Anforderung keine Eigenschaft des Formularobjekts enthält
[Swift] Vielmehr ist es sinnvoll, var zu vermeiden und nur dann mit let zu deklarieren, wenn die Zuweisung des Anfangswertes einen Zweig enthält.
Was ist die Hauptmethode in Java?
Wenn Sie einem Argument in einer Ruby-Methode neu zuweisen und dann "super" aufrufen → Das neu zugewiesene wird verwendet
Benennen und rufen Sie in Ruby übergeordnete Klassenmethoden explizit auf
Ist es Mainstream, das schließende Tag des <P> -Tags nicht in Javadoc zu schreiben?
Ursache ist nicht sichtbar, wenn Methoden anderer Klassen in Java aufgerufen werden
[Java] Wenn Sie eine Zeichenfolge in die switch-Anweisung einfügen, müssen Sie sie zu einem konstanten Ausdruck machen
[Bestellmethode] Legen Sie die Reihenfolge der Daten in Rails fest
[Java] Behandlung von Java Beans in der Methodenkette
Verhalten, wenn Platzhalter (**) in Ruby angegeben ist
Die Ruby-Version wird in der .rbenv / version-Datei verwaltet
Wenn das Projekt nicht in Eclipse angezeigt wird