class Parent
def test
return
end
end
class Child < Parent
def test
super
p "HOW IS THIS POSSIBLE?!"
end
end
c = Child.new
c.test
尽管如此,由于test
类的Parent
方法立即使用return语句,因此不应该打印Child
类的行。但它确实印刷了。那是为什么?
Ruby 1.8.7,Mac OSX。
答案 0 :(得分:11)
在此上下文中考虑调用super
的另一种方法是它是否是任何其他方法:
class Parent
def foo
return
end
end
class Child < Parent
def test
foo
p "THIS SEEMS TOTALLY REASONABLE!"
end
end
c = Child.new
c.test
# => "THIS SEEMS TOTALLY REASONABLE!"
如果你真的想阻止对p
的调用,你需要在条件中使用super
的返回值:
class Parent
def test
return
end
end
class Child < Parent
def test
p "THIS SEEMS TOTALLY REASONABLE!" if super
end
end
c = Child.new
c.test
# => nil
答案 1 :(得分:8)
super
就像调用超类的方法实现的方法调用一样。在您的示例中,return
关键字从Parent::test
返回并继续执行Child::test
,就像任何其他方法调用一样。
答案 2 :(得分:0)
这是祖先的顺序。
允许从增压方法提前返回的另一种方法是使用模块/关注点实现(而不是继承)并在其前面加上(而不是包含)。
class TestConcern
def test
return
super # this line will never be executed
end
end
class Child
prepend TestConcern
def test
p "THIS LINE WILL NOT BE PRINTED... (but it's quite an obfuscated behaviour)"
end
end
顺便说一句,我觉得这很模糊而不是简化。
答案 3 :(得分:0)
这是一种使用 yield 和 block 解决此问题的方法。 ?
class Parent
def test
return
yield
end
end
class Child < Parent
def test
super do
p "HOW IS THIS POSSIBLE?!"
end
end
end