这是我将任意参数传递给 a 的方式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)
您可以简单地将两个参数传递给块:
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
s - lambda
s 将引发错误。您实际上可以通过调用来确定是否是这种情况Proc#lambda?
此外,如果您不打算存储块,那么简单地使用yield
:
def with_arguments
yield 'foo', 'bar'
end