我正在学习Ruby中的元编程,尝试通过method_missing和define_method定义缺失的方法。我得到了一些意想不到的行为,想知道是否有人能解释一下。这是我的类:
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
现在,这段代码:
x = X.new
x.some_method
puts
x.some_method
puts
puts x
生成输出:
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>
我不明白的是最后一部分:为什么Ruby在调用puts时会调用to_ary?为什么Ruby要将我的对象转换为数组才能打印它?
我已经搜索到了以下相关链接:
- 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/
我还应该提到,即使我定义了一个to_s方法,行为也不会改变,例如:
def to_s
"I'm an instance of X"
end
"puts x" 的输出结果是:
method to_ary not found. Defining it.
defined method to_ary
I'm an instance of X