Man kann nicht wirklich sagen.
Die einzige Möglichkeit, auf eine Methode zuzugreifen, besteht darin, die Nachricht #method
an ein Objekt zu senden, das dann ein Objekt Method
zurückgibt. Aber ist das Method
Objekt die Methode selbst? Oder ist es ein Wrapper um die Methode? Oder ist es eine konvertierte Version der ursprünglichen Methode?
Sie können nicht wissen: Wenn Sie eine Methode betrachten möchten, müssen Sie #method
anrufen, an diesem Punkt erhalten Sie definitiv wird ein Objekt erhalten. Was es war vor Sie angerufen #method
können Sie nicht betrachten, daher können Sie nicht sagen.
Ein paar Datenpunkte: In Ruby gibt alles einen Wert zurück. Was gibt def
zurück? Es immer gibt nil
zurück, kein Method
Objekt. Und define_method
? Es gibt eine Proc
, aber keine Method
(noch eine UnboundMethod
) zurück. [Hinweis: In Rubinius gibt def
den kompilierten Bytecode der Methode zurück, aber immer noch kein Method
Objekt.]
Wenn Sie den vierten und fünften Abschnitt von Abschnitt 6.1 der Ruby Language Specification (Zeilen 29-34 und 1-5 auf den Seiten 5 und 6) betrachten, können Sie deutlich sehen, dass zwischen Methoden unterschieden wird und Objekte. Und wenn Sie sich die Spezifikation der eingebauten Klassen ansehen, werden Sie feststellen, dass weder Method
noch UnboundMethod
drin sind, noch ist Object#method
. IOW: Sie können einen vollkommen standardkonformen Ruby-Interpreter erstellen, in dem die Methoden keine Objekte sind.
Nun, Blöcke OTOH definitiv sind nicht Objekte. Es gibt viele Möglichkeiten, KonstrukteProc
Objekte aus Blöcken, die dann das gleiche Verhalten wie der ursprüngliche Block (lambda
, proc
, Proc.new
, die &
Sigil) haben, aber Blöcke selbst sind keine Objekte.
Denken Sie darüber nach: Sie können eine Zeichenfolge an File.new
übergeben, um ein Dateiobjekt zu erstellen, aber das macht keine Zeichenfolge zu einer Datei. Sie können einen Block an Proc.new
übergeben, um ein proc-Objekt zu erstellen, aber das macht einen Block nicht zu einem proc.
Funktionen sind erstklassige Bürger in Ruby und können in Objekte umgewandelt werden, also warum sich sorgen? Ich denke, die Antwort wird zu niedrig liegen, um viel Sinn zu machen ... –
Sind sie? IMHO, die Tatsache, dass Sie sie in Objekte konvertieren müssen, macht sie nicht-erste Klasse. Das möchte ich auch aus den Antworten lernen. –