Was ist das Objekt in Rubys "Hallo Welt"?

8

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?

    
A. N. Other 29.01.2017, 09:57
quelle

3 Antworten

10

puts

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.

Kernel # puts

%Vor%

ist eigentlich

%Vor%

Dabei ist self das Objekt main .

Also puts "hello world" ist a:

  • Kernel # puts Methodenaufruf
  • auf main
  • mit einem String-Objekt als Argument.

Notizen

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%

Test

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.

2 + 3

Im gleichen Sinne: 2+3 ist tatsächlich Integer(2).+( Integer(3) ) .

    
Eric Duminil 29.01.2017 10:07
quelle
10
  

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 :

in eine Zeichenkette konvertieren %Vor%

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.

    
Jörg W Mittag 29.01.2017 11:27
quelle
1

"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

%Vor%

wo myFoo ein gültiges Objekt sein muss ... in deinem Fall myFoo = "Hello world"

    
quelle

Tags und Links