1
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

方法定义?还给我假?即使我宣布看跌期权是公开的,为什么?

4

2 回答 2

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因为原来的类不包含你添加的单例方法。

于 2012-11-08T15:56:50.387 回答
0

解释的文档method_defined?

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

并且public方法仅设置可访问性;它不会将方法定义移动到对象的上下文中。

于 2012-11-08T15:50:00.527 回答