2011-08-07 12 views
8

En el MRI implementation of gc.c vi un objeto llamado undef. ¿Cuál es ese objeto undef? ¿Cuál es su clase? ¿Cómo puedo acceder? ¿Hay alguna utilidad para eso?¿Cuál es el objeto "undef" de Ruby?

+2

No sé qué es, pero probablemente no esté relacionado con el método 'undef' utilizado para definir un método. –

+1

@Andrew Grimm, sí, ¡estoy de acuerdo! –

Respuesta

5

Esta es una suposición educada de mi parte, tal vez Matz verá esta pregunta en algún momento y nos dará una respuesta definitiva, con suerte esto servirá mientras tanto.

Como ya sabrá, el perl se vio algo influenciado por perl al menos al principio (por eso tenemos variables como $ @ y $ _ etc.). Perl tiene una palabra clave/función undef (por ejemplo, si declara una variable sin inicializar, su valor no está definido). Diría que en algún momento en el pasado Ruby también tenía la intención de tener algo similar (es decir, las variables podrían tener un valor indefinido). Cómo sabemos esto? Por el contexto en el que se encuentra.

Como puede ver, ese comentario describe cómo se deriva el object_id de varios objetos de Ruby. Se pueden encontrar algunos detalles al respecto here. Pero, en esencia, sabemos lo siguiente:

false.object_id == 0 
true.object_id == 2 
nil.object_id == 4 

Esto es lo que sugiere el comentario y este es el caso, puede abrir una grieta en una sesión irb y probarlo por ti mismo. Parece que undef estaba destinado a tener un object_id de 6.

Ahora, undef es de hecho una palabra reservada en Ruby, pero no es un objeto especial como nil, false y true, es - como sabemos - una palabra clave utilizada para definir un método.

Por lo tanto, para responder a su pregunta, no hay ningún objeto undef, no tiene clase y no puede acceder a él. El objetivo que se esperaba que cumpliera el undef es el objeto nil en el Ruby que conocemos actualmente. Pero, se ha mantenido en el código como un legado de tiempos pasados, para los más curiosos de nosotros para encontrar y resolver.

+0

Encontré que no es un objeto porque no puedo recuperar uno con 'ObjectSpace._id2ref (6)'. Se encuentra en [muchos lugares] (http://rxr.whitequark.org/mri/ident?i=Qundef), y [aquí] (http://rxr.whitequark.org/mri/source/include/ruby/ ruby.h # 352) se denomina "valor indefinido para marcador de posición".De hecho, se usa para representar valores indefinidos (o nulos) en lugar de 0, -1, NULL, etc. Parece necesario evitar entrar en conflicto con cualquier objeto Ruby válido. Un buen ejemplo es [invalidar variables de instancia eliminadas] (http://rxr.whitequark.org/mri/source/variable.c#1279). –

+0

Y +1 para su enlace sobre valores. ¡Gracias! :) –

+0

En ese último ejemplo, me parece que Qundef se usa para sobrescribir el valor de la variable de instancia que se está eliminando. Debe ser necesario para que Ruby haga una excepción si intenta acceder a esa variable de instancia. Si simplemente usaron Qnil, supongo que no obtendría una excepción, sino que obtendría nada como el valor de retorno que no es el comportamiento que desea. Muy interesante, disfruté bastante investigando esto - buena pregunta. – skorks

-2

Estoy bastante seguro de que esto se refiere a una variable indefinida (en contraposición a una variable definida como nil).

Tome un vistazo a esto:

def hello(object = 'World') 
    puts "Hello #{object}" 
end 

hello     #=> 'Hello World' 
hello 'stackoverflow' #=> 'Hello stackoverflow' 
hello nil    #=> 'Hello ' 

EDIT: para concluir con una respuesta más completa a su pregunta. Nunca podrá acceder a ese objeto undef. Solo existe en la definición del método, no en su cuerpo. O bien está lleno con un valor predeterminado (como 'World' arriba) o obtendrá un ArgumentError porque no especificó todos los parámetros del método.

+0

Ah, me llevó un minuto entender su respuesta. Hay una diferencia entre pasar ningún argumento a un método y pasar 'nil'. Esa diferencia es el objeto 'undef'. ¿Es eso lo que estás diciendo? – mikezter

+0

Los valores de argumento correctos y predeterminados solo tienen prioridad si literalmente no se pasa ningún valor. – Koraktor

Cuestiones relacionadas