4

Proc 内でブロックを生成できますか? 次の例を検討してください。

a = Proc.new do
  yield
end

a.call do
  puts "x"
end

私が達成しようとしているのは printxですが、これを Ruby 2.0 で解釈すると が発生しLocalJumpError: no block given (yield)ます。

4

2 に答える 2

4

いいえ、できません。作成した Proc は独立してyieldいるyieldためです。つまり、コンテキストにブロックがない です。指定したパラメーターで procs を呼び出して、パラメーターを proc に渡すことはできますが、指定されたパラメーターにyield基づいて機能しません。proc のクロージャ内にあるブロックを実行します。また、プロシージャのクロージャーは事前定義されています。後でブロックで呼び出すという理由だけで変更されることはありません。

したがって、エラーirbを返す「yield」を(メソッド定義内ではなく)直接入力するのと同じです。LocalJumpError: no block given (yield)

于 2013-07-23T18:56:20.543 に答える
4

@Rebitzele は、コードが機能しない理由を説明しています。yieldキーワードは、メソッドに渡された無名ブロックを呼び出すための簡略表記であり、この場合はメソッドすらありません

ただし、もちろん、ブロックに名前を付けて、他の呼び出し可能なオブジェクトを呼び出すように呼び出すことができます。

a = ->&block { block.() }

a.() do puts 'x' end
# x
于 2013-07-23T22:11:30.893 に答える