新手问题 关于 TOPLEVEL_BINDING 的一个问题

ibachue · 2013年02月28日 · 最后由 u1359726747 回复于 2013年06月16日 · 2471 次阅读
class A
  eval 'def f; "hello world"; end'
end  

A.new.f # => "hello world"
A.f # NoMethodError: undefined method `f' for A:Class
f # NameError: undefined local variable or method `f' for main:Object

class A
  eval 'self', TOPLEVEL_BINDING # => main
end

class A
  eval 'def g; "hello world"; end', TOPLEVEL_BINDING
end  

g # => "hello world"
A.new.g # NoMethodError: private method `g' called for #<A:0x007f81af845e58>

各位, 我写了一段简单的代码来试试看 TOPLEVEL_BINDING 这个全局常量,上述返回结果绝大多数都是 expected 的,除了最后一个 为什么 g 方法会变成 A 对象的私有方法呢?我之前认为 g 应该仅仅只是 main 下的一个方法才对。而且我之后尝试过

A.new.send(:g) # => "hello world"

可见确实是我定义的那个 g 方法,不知道为什么,只能请教大家了 谢谢

def a; "hello world";end
p method(:a).owner

class A
  eval 'def g; "hello world"; end', TOPLEVEL_BINDING
end  
p method(:g).owner

试了下,貌似直接在 TOPLEVEL_BINDING 定义也是定义到 Object 里,以前还真没注意到这个

私有方法是正确的啊 这是 top level 的一个特性。 http://hooopo.iteye.com/blog/370726

#2 楼 @hooopo 感谢大神解答

ruby2.0 下的 IRB 定义的方法改成了 main:Object 的 private 的

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