に任意の引数を渡す方法は次のlambdaとおりです。
def with_arguments(&block)
args = %w(foo bar)
n = block.arity
block.call *(n < 0 ? args : args.take(n))
end
with_arguments &lambda { |foo| }
with_arguments &lambda { |foo, bar| }
with_arguments &lambda { |*args| }
with_arguments &lambda { |foo, *args| }
with_arguments &lambda { |foo, bar, *args| }
nが負の場合、lambdaは任意の数の引数を取ります。これらの引数の正確(n + 1).absには必須です。その情報を使用して、渡す引数を決定できます。
lambdaが有限個の引数をとる場合、の最初のn要素を渡すだけですargs。任意の数の引数を取る場合は、引数配列全体を渡すだけです。
lambda自体argsが不十分なケースを処理します。
with_arguments &lambda { |foo, bar, baz, *args| }
# ArgumentError: wrong number of arguments (2 for 3)
2 つの引数をブロックに渡すだけです。
def with_arguments(&block)
block.call 'foo', 'bar'
end
with_arguments { |x| puts x } # y is not used
with_arguments { |x, y| puts x, y } # All arguments are used
with_arguments { |x, y, z| puts x, y, z } # z will be nil
未使用のブロック引数は破棄され、余分なパラメーターは に設定されnilます。
これは通常のブロックに固有Proclambdaのものであり、間違った数のパラメーターが指定された場合、s – s はエラーを発生させます。これが当てはまるかどうかは、実際に呼び出すことで確認できます。Proc#lambda?
また、ブロックを保存しない場合は、次のように単純に使用する方がクリーンですyield。
def with_arguments
yield 'foo', 'bar'
end