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
方法定义?还给我假?即使我宣布看跌期权是公开的,为什么?
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
方法定义?还给我假?即使我宣布看跌期权是公开的,为什么?
o.class
=> Object
Object.method_defined? :puts
=> false
o.singleton_class
=> #<Class:#<Object:0x2b23858>>
o.singleton_class.method_defined? :puts
=> true
我认为上面的代码显示了非常清楚的解释。如果你修改了对象本身,你应该使用singleton_class
来访问而不是class
因为原来的类不包含你添加的单例方法。
如果命名方法由 mod(或其包含的模块,如果 mod 是一个类,它的祖先)定义,则返回 true
并且该public
方法仅设置可访问性;它不会将方法定义移动到对象的上下文中。