我很困惑。
当我在对象中定义方法时
我可以在对象超类BasicObject中调用它!
像这样:
class Object
def object_method
"object_method called"
end
end
Object.superclass.respond_to? :object_method
# => true
Object.superclass.object_method
# => "object_method called"
我期望只有派生类继承新方法!
附:我是在rubymonk
…在对象中实现方法超类。
其中递归停止条件是“受影响的”。
最佳答案
当调用Object.superclass
时,会得到一个描述BasicObject
类的对象。
此对象是继承自Class
的Object
类的实例。因此,它拥有Object
拥有的所有方法,包括您添加的方法。
但是,BasicObject
类的实例没有此方法:
irb(main):122:0> Object.object_method
=> "object_method called"
irb(main):123:0> Object.new.object_method
=> "object_method called"
irb(main):124:0> Object.superclass.object_method # Same as BasicObject.object_method
=> "object_method called"
irb(main):125:0> Object.superclass.new.object_method # Same as BasicObject.new.object_method
NoMethodError: undefined method `object_method' for #<BasicObject:0x441743be>
from (irb):125:in `evaluate'
from org/jruby/RubyKernel.java:1065:in `eval'
from org/jruby/RubyKernel.java:1390:in `loop'
from org/jruby/RubyKernel.java:1173:in `catch'
from org/jruby/RubyKernel.java:1173:in `catch'
from ~/.rvm/rubies/jruby-1.7.0/bin/irb:13:in `(root)'
这里有更多的东西可以冥想:
irb(main):129:0> Object
=> Object
irb(main):130:0> Object.class
=> Class
irb(main):131:0> Object.new.class
=> Object
irb(main):132:0> Object.superclass
=> BasicObject
irb(main):133:0> Object.superclass.class
=> Class
irb(main):134:0> Object.superclass.new.class
NoMethodError: undefined method `class' for #<BasicObject:0x1c944d4a>
from (irb):134:in `evaluate'
from org/jruby/RubyKernel.java:1065:in `eval'
from org/jruby/RubyKernel.java:1390:in `loop'
from org/jruby/RubyKernel.java:1173:in `catch'
from org/jruby/RubyKernel.java:1173:in `catch'
from ~/.rvm/rubies/jruby-1.7.0/bin/irb:13:in `(root)'
玩得高兴!
关于ruby - 为什么Object.superclass.respond_to? :object_method?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16908116/