に任意の引数を渡す方法は次の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
ます。
これは通常のブロックに固有Proc
lambda
のものであり、間違った数のパラメーターが指定された場合、s – s はエラーを発生させます。これが当てはまるかどうかは、実際に呼び出すことで確認できます。Proc#lambda?
また、ブロックを保存しない場合は、次のように単純に使用する方がクリーンですyield
。
def with_arguments
yield 'foo', 'bar'
end