Ruby: Pourquoi les put appelle-t-il à_ary?
-
12-11-2019 - |
Question
J'apprends la métaprogrammation dans Ruby et j'essaie simplement de définir des méthodes manquantes via Method_missing et Define_Method. Je reçois un comportement inattendu et je me demande si quelqu'un peut expliquer cela. Voici ma classe:
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
Maintenant, ce code:
x = X.new
x.some_method
puts
x.some_method
puts
puts x
Produit la sortie:
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>
Ce que je n'obtiens pas, c'est la dernière partie: pourquoi Ruby appelle-t-il un appel à un appel? Pourquoi Ruby essaierait-il de convertir mon objet en un tableau juste pour l'imprimer?
J'ai googlé et j'ai trouvé ces liens connexes:
- http://denderlovemaking.com/2011/06/28/til-itts-ok-to-return-nil-from-to_ary/
- http://yehudakatz.com/2010/01/02/the-craziest-fing-bug-ive-ever-seen/
Ceux-ci parlent également de Method_missing et To_ary Gotchas, mais pas spécifiquement sur les raisons pour lesquelles Puts appellerait à_ary.
Je dois également mentionner que le comportement ne change pas lorsque je définis un TO_S, par exemple
def to_s
"I'm an instance of X"
end
La sortie de "pout x" est alors:
method to_ary not found. Defining it.
defined method to_ary
I'm an instance of X
Pas de solution correcte