在Ruby中的层次结构上混淆

时间:2013-11-18 07:11:24

标签: ruby

如果我们可以这样做:

class Child
  def child_method
    puts "hi world"
  end
end

child = Child.new
child.child_method

哪个调用方法put,它在Kernel中定义并混合在Object中。

为什么我们不能这样做:

class Parent
  def test
    puts "hi from parent"
  end
end


class Child
  def child_method
    test
  end
end

child = Child.new
child.child_method

为什么我们不能在Parent对象上调用该方法,就像我们使用“puts”一样?

2 个答案:

答案 0 :(得分:3)

当你如下:

class Child
  def child_method
    puts "hi world"
  end
end

默认情况下,Object成为Child的超类。核心中混有Object个。所以Kernel也在Child的祖先链中。因此,您可以调用puts的{​​{1}}私有方法。

Kernel

现在来看下面的课程定义:

child = Child.new
child.class.ancestors # =>[Child, Object, Kernel, BasicObject]

由于您没有继承class Parent def test puts "hi from parent" end end p Parent.ancestors # => [Parent, Object, Kernel, BasicObject] class Child def child_method test end end p Parent.ancestors # => [Parent, Object, Kernel, BasicObject] Parent类,因此Child成为Object的默认超类。因此,Child类无法使用test方法。如果您需要,请执行以下操作:

Child

现在它正在工作,因为class Parent def test puts "hi from parent" end end class Child < Parent def child_method test end end child = Child.new child.child_method # => "hi from parent" 现在位于Parent的祖先链中。

Class

答案 1 :(得分:1)

你忘了继承。 class Child < Parent并且它有效。仅仅因为你打电话给班级ChildParent,他们就不会这样。 :P