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 に答える