Ruby 为什么每次调用 Shell 命令的时候,method_missing 都会被调用到?

crazyjin · 2018年04月01日 · 最后由 crazyjin 回复于 2018年04月01日 · 1495 次阅读

我重写了 method_missing,如题。

代码:

def method_missing(method, *args)
  puts "method_missing called: #{method}"
  super
end
`ls`

输出:

method missing called! to_ary

把代码贴上来啊

改成这样试试

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,也会出现调试信息),会忽略报错

扩展了我的思路,多谢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号