我很困惑。
当我在对象中定义方法时
我可以在对象超类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类的对象。
此对象是继承自ClassObject类的实例。因此,它拥有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/

10-13 02:19