Estoy aprendiendo metaprogramación en Ruby y estoy probando la definición de métodos faltantes a través de method_missing y define_method. Tengo un comportamiento inesperado y me pregunto si alguien puede explicar esto. Aquí está mi clase:Ruby: ¿por qué puts llama a_ary?
class X
def method_missing(m, *args, &block)
puts "method #{m} not found. Defining it."
self.class.send :define_method, m do
puts "hi from method #{m}"
end
puts "defined method #{m}"
end
end
Ahora, este código:
x = X.new
x.some_method
puts
x.some_method
puts
puts x
produce la salida:
method some_method not found. Defining it.
defined method some_method
hi from method some_method
method to_ary not found. Defining it.
defined method to_ary
#<X:0x007fcbc38e5030>
Lo que no entiendo es la última parte: ¿por qué está llamando Rubí to_ary en una llamada a puts? ¿Por qué Ruby trataría de convertir mi objeto en una matriz solo para imprimirlo?
Tengo Googled alrededor y encontrado los enlaces relacionados:
- http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary/
- http://yehudakatz.com/2010/01/02/the-craziest-fing-bug-ive-ever-seen/
Estos también hablan de method_missing y to_ary trampas, pero no específicamente acerca de por qué pone llamarían to_ary .
También debo mencionar que el comportamiento no cambia cuando defino un to_s, p. Ej.
def to_s
"I'm an instance of X"
end
La salida de hace "x" es entonces:
method to_ary not found. Defining it.
defined method to_ary
I'm an instance of X
Gracias. Creo que la esencia es que "el uso interno de to_ary no está bien documentado en la documentación de Ruby" :) Acabo de leer los documentos de IO.puts, que no mencionan explícitamente a toary, esto debería ser más claro, creo. Gracias por señalar el libro "El lenguaje de programación de Ruby", podría verificarlo. –