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?
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:
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.
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.