Wenn alles ein Objekt in Ruby ist, bis zu dem Punkt, dass sogar mathematische Operatoren Methoden sind, die auf Objekte angewendet werden, wenn ich schreibe:
%Vor%Die Methode ist puts und der Parameter ist "Hallo Welt" , aber was ist das Objekt?
Um eine Methode zu finden, können Sie Folgendes aufrufen:
%Vor% So puts
ist eine in Kernel
definierte Methode, die für jedes Objekt verfügbar ist.
ist eigentlich
%Vor% Dabei ist self
das Objekt main
.
Also puts "hello world"
ist a:
main
Beachten Sie, dass wenn Sie
ausführen %Vor%Sie erhalten einen Fehler:
%Vor%Weil jede Kernel-Methode für jedes Objekt verfügbar ist, aber als private Methode. Du brauchst:
%Vor%Eine andere Möglichkeit zu überprüfen wäre:
%Vor%Es gibt aus:
%Vor%Siehe? Alles ist ein Objekt, auch wenn es nicht so aussieht.
Im gleichen Sinne: 2+3
ist tatsächlich Integer(2).+( Integer(3) )
.
Wenn alles ein Objekt in Ruby ist,
Das ist ein leicht irreführender Wortlaut. Z.B. Syntax ist kein Objekt, Blöcke sind keine Objekte, ein bedingter Ausdruck ist kein Objekt.
Eine bessere Formulierung wäre: "Jeder Wert ist ein Objekt".
bis zu dem Punkt, dass sogar mathematische Operatoren Methoden auf Objekte angewendet werden, wenn ich schreibe:
%Vor%Die Methode ist puts und der Parameter ist "Hallo Welt" , aber was ist das Objekt?
Es sind zwei Objekte beteiligt. Ich vermute, was Sie wirklich fragen wollten, ist "Was ist das Empfänger Objekt". (Es sind tatsächlich viel mehr Objekte beteiligt, aber konzentrieren wir uns jetzt auf den Empfänger und das Argument.)
Eine Nachrichtensendung hat immer ein Empfängerobjekt , d. h. das Objekt, an das Sie die Nachricht senden. Wenn das Empfängerobjekt nicht explizit ausgeschrieben ist, wird implizit von self
ausgegangen (eine Pseudovariable, die immer das "aktuelle Objekt" auswertet). Nun, die Frage ist: Was (oder "wer") ist self
hier?
Dies ist übrigens eine der wichtigsten Fragen, die Sie sich beim Schreiben von Ruby-Code stellen sollten. Empfängerlose Nachrichten senden sind self
, Instanzvariablen werden in self
nachgeschlagen. Sie sollten sich immer bewusst sein, welches Objekt self
an dem Punkt ist, an dem Sie Ihren Code schreiben.
In diesem speziellen Fall ist self
ein vordefiniertes Objekt, das Rubyists main
aufruft, wenn Sie Code schreiben, der von Rubyisten als Top-Level bezeichnet wird. Es hat eigentlich keinen Namen, und es gibt keinen Standardverweis darauf, aber 'main'
ist das, was es zurückgibt, wenn Sie inspect
it oder es mit to_s
:
Das zweite Objekt, das Sie bereits korrekt identifiziert haben: Es ist das String
-Objekt, das aus der Auswertung des String-Literals "Hello World"
resultiert.
Hier sind jedoch mehr Objekte involviert. Zum Beispiel ist main
eine Instanz von Object
, also muss auch Object
existieren. "Hello world"
ist eine Instanz von String
, String
muss existieren. String
und Object
sind beide Klassen, d. h. Objekte, die Instanzen der Klasse Class
sind, also muss Class
existieren. Die Oberklasse von Object
ist BasicObject
. Die Oberklasse von Class
ist Module
. Object
mischt in Kernel
(was eine Instanz der Klasse Module
ist). Kernel#puts
gibt nil
zurück, was eine Instanz von NilClass
ist. Kernel#puts
ist nur eine Hilfsmethode, die an IO#puts
delegiert wird, indem $stdout.puts
aufgerufen wird.
Also sind neben main
und "Hello world"
, mindestens auch folgende Objekte beteiligt: nil
, NilClass
, String
, Class
, Module
, Object
, Kernel
, BasicObject
, IO
und das IO
-Objekt, das der globalen Variablen $stdout
zugeordnet ist und den Standardausgabe-Stream Ihres Ruby-Prozesses darstellt.
Das sind 12 Objekte, die direkt und unmittelbar in die Ausführung Ihres Code-Snippets involviert sind.
In Wirklichkeit gibt es selbst in einem einfachen Ruby-Programm noch viel mehr Objekte:
%Vor% Auf meinem System wird eine Zahl von ungefähr 9780 Objekten gedruckt. Einige davon sind das Hash
erstellt von ObjectSpace::count_objects
und die Schlüssel und Werte innerhalb dieses Hash
(wie zum Beispiel das Symbol
Objekt :TOTAL
) und natürlich das String
, das erstellt wurde, indem versucht wurde zu drucken aus dem Ergebnis. Aber das liegt in der Größenordnung von ungefähr ~ 35 Objekten, also sind immer noch fast 10000 Objekte an der Ausführung von, naja, im Grunde ein leeres Programm beteiligt, das nichts tut.
"Hallo Welt" ist das Zeichenfolgenobjekt, das als Literalkonstante definiert ist, die als Argument für die puts -Methode
angegeben wird puts "Hello world"
ist tatsächlich eine einfache Methode
wo myFoo ein gültiges Objekt sein muss ... in deinem Fall myFoo = "Hello world"