这段代码按预期工作(什么也不做,甚至不会产生警告/错误):
l = lambda {|i|}
l.call(1)
此代码生成警告(警告:一个块参数有多个值(0代表1)):
l = lambda {|i|}
l.call
此代码失败并返回错误(ArgumentError:参数数量错误(2为0)):
l = lambda {|i, y|}
l.call
我认为lambda需要传递所有的参数。
从第二个例子中我发现它不是这样的,为什么它在只给出一个参数的情况下工作,而在有多个参数的情况下按预期工作(由于错误而失败)?
PS: ruby 1.8.6 (2008-08-11补丁级别287)通用-darwin9.0
更新:我已经用ruby 1.9.1p376检查了这些示例。它按照预期工作--第二个例子也产生了一个错误。看起来这是1.8版本(或<=1.8)的一个特性
发布于 2010-02-10 04:39:49
Lambda就是这样奇怪的,当你的参数少于两个时,它们的行为是不同的。有关更多信息,请查看this article。
发布于 2010-02-10 04:28:12
This script会教你所有你需要知道的关于Ruby闭包的知识。
# So, what's the final verdict on those 7 closure-like entities?
#
# "return" returns from closure
# True closure? or declaring context...? Arity check?
# --------------- ----------------------------- -------------------
# 1. block (called with yield) N declaring no
# 2. block (&b => f(&b) => yield) N declaring no
# 3. block (&b => b.call) Y except return declaring warn on too few
# 4. Proc.new Y except return declaring warn on too few
# 5. proc <<< alias for lambda in 1.8, Proc.new in 1.9 >>>
# 6. lambda Y closure yes, except arity 1
# 7. method Y closure yes
https://stackoverflow.com/questions/2232283
复制相似问题