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?
Respuesta
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.
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). –
Y +1 para su enlace sobre valores. ¡Gracias! :) –
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
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.
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
Los valores de argumento correctos y predeterminados solo tienen prioridad si literalmente no se pasa ningún valor. – Koraktor
- 1. ¿Cuál representa nulo? undef o cadena vacía
- 2. ¿Cuál es el equivalente Ruby de "pythonic"?
- 3. ¿Cuál es el significado de $$ en Ruby?
- 4. ¿Por qué mi hash no es undef?
- 5. Cuál es la diferencia entre el retorno; y regresar undef; en Perl
- 6. ¿Cuál es el equivalente de Python al "inspeccionar" de Ruby?
- 7. ¿cuál es el objeto Clase (java.lang.Class)?
- 8. Uso de #undef en C++
- 9. ¿Cuál es el equivalente de Ruby para StringReader de Java?
- 10. ¿Cuál es el equivalente Ruby de os.walk de Python?
- 11. ¿Cuál es el equivalente de Ruby de preg_quote()?
- 12. ¿Cuál es el equivalente Ruby de python setup.py develop?
- 13. ¿Cuál es el significado de "do | |" en Ruby?
- 14. ¿Cuál es el significado de i.to_s en Ruby?
- 15. ¿Cuál es el operador <= en las clases de Ruby?
- 16. ruby: ¿Cuál es el significado de la palabra clave "en"
- 17. cuál es el tipo de PI, cos en Ruby
- 18. Cuál es el equivalente a "Método de referencia" en Ruby
- 19. ¿Cuál es el operador de comparación! = ~ En ruby?
- 20. ¿Cuál es el reverso de Math Power (**) en Ruby?
- 21. ¿Cuál es el conjunto de herramientas RDF preferido para Ruby?
- 22. ¿Es todo un objeto en ruby?
- 23. ¿Cuál es el significado de * nix? ¿Y cuál es su relación con Ruby?
- 24. ¿Cuál es la mejor manera de burlarse de un objeto de terceros en ruby?
- 25. Compruebe si el objeto Ruby es un booleano
- 26. ¿Cuál es el uso de un objeto de unión constante?
- 27. ¿Cuál es el tipo de objeto anidado en scala
- 28. ¿Cuál es el equivalente Java de un objeto Scala?
- 29. ¿Cuál es el uso de un Objeto Dispatcher en WPF?
- 30. undef - ¿Por qué quieres definir un método en rubí?
No sé qué es, pero probablemente no esté relacionado con el método 'undef' utilizado para definir un método. –
@Andrew Grimm, sí, ¡estoy de acuerdo! –