3

誰かが次の行動を説明できますか

def iterate
  return yield
  return "end of iterate"
end

def test_iterate
  assert_equal( "end of iterate",  iterate { return "end of block" } )
  assert_equal( "end of block",  iterate { "end of block" } )
end

Procs(ブロックとは何か)は、呼び出されたスコープ内に戻る必要があることを理解しています。(ラムダとは異なり)これを念頭に置いて、テストの両方の呼び出しが「ブロックの終わり」を返すべきではありませんか?

このテストは'ruby1.8.7(2009-06-12 patchlevel 174)[universal-darwin10.0]'(OSX 10.6.7)に合格します

4

1 に答える 1

4

returnキーワードは、字句を囲むメソッドから戻ります。つまり、*test_iterate*です。

動的スコープ方式でブロックから特定の値を返すには、代わりにbreakキーワードを使用する必要があります。

あなたの場合:

iterate { break("end of block") }

テストは失敗します。iterateメソッドの2番目のreturnステートメントは実行されないためです。

意図されたセマンティクスは、例外を使用して実行する必要があります。

def iterate
  return yield
  rescue :exception
    return "end of iterate"
end

def test_iterate
  assert_equal( "end of iterate",  iterate { raise :exception } )
  assert_equal( "end of block",  iterate { "end of block" } )
end
于 2011-04-23T10:31:20.380 に答える