Was ist das "undef" -Objekt von Ruby?

8

In der MRI-Implementierung von gc.c habe ich ein Objekt namens undef gesehen. Was ist das undef Objekt? Was ist seine Klasse? Wie kann ich darauf zugreifen? Gibt es ein Dienstprogramm dafür?

    
Sony Santos 07.08.2011, 19:34
quelle

2 Antworten

5

Dies ist eine fundierte Vermutung von meiner Seite, vielleicht wird Matz diese Frage irgendwann sehen und uns eine definitive Antwort geben, hoffentlich wird dies in der Zwischenzeit tun.

Wie Sie vielleicht wissen, wurde Ruby schon früh von Perl beeinflusst (deshalb haben wir Variablen wie $ @ und $ _ usw.). Perl hat ein undef Schlüsselwort / Funktion (z. B. wenn Sie eine Variable ohne Initialisierung deklarieren - ihr Wert ist nicht definiert). Ich würde sagen, dass Ruby irgendwann in der Vergangenheit auch etwas ähnliches hatte (d. H. Variablen könnten einen undefinierten Wert haben). Woher wissen wir das? Durch den Kontext, in dem es gefunden wird.

Wie Sie sehen können, beschreibt dieser Kommentar, wie die object_id der verschiedenen Ruby-Objekte abgeleitet werden. Einige Details dazu finden Sie hier . Aber im Wesentlichen wissen wir Folgendes:

%Vor%

Dies ist, was der Kommentar andeutet, und das ist in der Tat der Fall, Sie können eine irb -Sitzung öffnen und es selbst ausprobieren. Es sieht so aus, als ob undef eine object_id von 6 haben soll.

Nun ist undef zwar ein reserviertes Wort in Ruby, aber es ist kein spezielles Objekt wie nil , false und true , es ist - wie wir wissen - ein Schlüsselwort, um eine Methode zu definieren .

Also, um Ihre Frage zu beantworten, gibt es kein undef -Objekt, es hat keine Klasse und Sie können nicht darauf zugreifen. Der Zweck, dem undef dienen sollte, wird stattdessen von dem Objekt nil im Ruby bedient, das wir heute kennen. Aber es ist im Code als ein Vermächtnis vergangener Zeiten geblieben, für die Neugierigen von uns, um zu finden und zu rätseln.

    
skorks 08.08.2011, 12:34
quelle
-2

Ich bin mir ziemlich sicher, dass sich dies auf eine undefinierte Variable bezieht (im Gegensatz zu einer Variable, die als nil definiert ist).

Sieh dir das an:

%Vor%

BEARBEITEN: Um mit einer vollständigeren Antwort auf Ihre Frage abzuschließen. Sie werden niemals auf das undef -Objekt zugreifen können. Es existiert nur in der Methodendefinition, nicht in seinem Körper. Entweder ist es mit einem Standardwert gefüllt (wie 'World' oben) oder Sie erhalten ArgumentError , weil Sie nicht alle Methodenparameter angegeben haben.

    
Koraktor 08.08.2011 06:58
quelle

Tags und Links