如果我们可以这样做:
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”一样?
答案 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
并且它有效。仅仅因为你打电话给班级Child
和Parent
,他们就不会这样。 :P