Proc 内でブロックを生成できますか? 次の例を検討してください。
a = Proc.new do
yield
end
a.call do
puts "x"
end
私が達成しようとしているのは printx
ですが、これを Ruby 2.0 で解釈すると が発生しLocalJumpError: no block given (yield)
ます。
Proc 内でブロックを生成できますか? 次の例を検討してください。
a = Proc.new do
yield
end
a.call do
puts "x"
end
私が達成しようとしているのは printx
ですが、これを Ruby 2.0 で解釈すると が発生しLocalJumpError: no block given (yield)
ます。
いいえ、できません。作成した Proc は独立してyield
いるyield
ためです。つまり、コンテキストにブロックがない です。指定したパラメーターで procs を呼び出して、パラメーターを proc に渡すことはできますが、指定されたパラメーターにyield
基づいて機能しません。proc のクロージャ内にあるブロックを実行します。また、プロシージャのクロージャーは事前定義されています。後でブロックで呼び出すという理由だけで変更されることはありません。
したがって、エラーirb
を返す「yield」を(メソッド定義内ではなく)直接入力するのと同じです。LocalJumpError: no block given (yield)
@Rebitzele は、コードが機能しない理由を説明しています。yield
キーワードは、メソッドに渡された無名ブロックを呼び出すための簡略表記であり、この場合はメソッドすらありません。
ただし、もちろん、ブロックに名前を付けて、他の呼び出し可能なオブジェクトを呼び出すように呼び出すことができます。
a = ->&block { block.() }
a.() do puts 'x' end
# x