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?还是给我假的?即使我宣布公开,为什么?
答案 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仅设置辅助功能;它不会将方法定义移动到对象的上下文中。