为什么method_defined?还是给我假的?

时间:2012-11-08 15:37:06

标签: ruby

o = Object.new

class << o
  public :puts
end
o.puts "1. #{o.class.method_defined? :puts}"              => false
o.puts "2. #{o.class.method_defined? :public_methods}     => true

method_defined?还是给我假的?即使我宣布公开,为什么?

2 个答案:

答案 0 :(得分:2)

o.class
=> Object

Object.method_defined? :puts
=> false

o.singleton_class
=> #<Class:#<Object:0x2b23858>>

o.singleton_class.method_defined? :puts
=> true

我认为上面的代码显示了非常明确的解释。如果您修改对象本身,则应使用singleton_class来访问而不是class,因为原始类不包含您添加的单例方法。

答案 1 :(得分:0)

The docs for method_defined?解释:

  

如果命名方法由mod(或其包含的模块定义,如果mod是类,它的祖先)定义,则返回true

the public method仅设置辅助功能;它不会将方法定义移动到对象的上下文中。