Ruby return语句不适用于super关键字?

时间:2012-05-09 15:37:21

标签: ruby

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。

4 个答案:

答案 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