15
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类的行。但它确实是打印出来的。这是为什么?

红宝石 1.8.7,Mac OSX。

4

4 回答 4

14

在这种情况下考虑调用的另一种方法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
于 2012-05-09T15:51:11.333 回答
9

super就像调用超类的方法实现的方法调用一样。在您的示例中,return关键字返回Parent::test并继续执行Child::test,就像任何其他方法调用一样。

于 2012-05-09T15:40:41.717 回答
2

这是一种使用 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
于 2021-04-29T10:12:10.350 回答
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

顺便说一句,我发现这种混淆而不是简化。

于 2021-03-16T09:28:55.257 回答