我重写了 method_missing,如题。
代码:
def method_missing(method, *args) puts "method_missing called: #{method}" super end `ls`
输出:
method missing called! to_ary
把代码贴上来啊
@theblock24block 贴上来了
改成这样试试
def method_missing(method, *args) puts caller puts "----method_missing called: #{self}, #{self.class}, #{method}" super end puts `ls`
结合之前@hooopo的实验:http://hooopo.iteye.com/blog/370726
(TOPLEVEL_BINDING 的方法会定义成 Object 的 private instance method)
猜测,反引号内会调用 to_ary 方法,但执行 shell 命令返回的内容被包装成 String 是没有 to_ary 方法的,原本方法查找会一直去到最顶层,但你在 Object 上定义了 method_missing,所以会输出你的调试信息,然后才 super 给往上一层,而最顶层发现调用栈有执行 shell 命令的操作(试了下 system,也会出现调试信息),会忽略报错
扩展了我的思路,多谢。