【发布时间】:2014-07-19 16:17:06
【问题描述】:
为什么带有 splat 参数的 Ruby (2.0) 过程/块的行为与方法和 lambda 不同?
def foo (ids, *args)
p ids
end
foo([1,2,3]) # => [1, 2, 3]
bar = lambda do |ids, *args|
p ids
end
bar.call([1,2,3]) # => [1, 2, 3]
baz = proc do |ids, *args|
p ids
end
baz.call([1,2,3]) # => 1
def qux (ids, *args)
yield ids, *args
end
qux([1,2,3]) { |ids, *args| p ids } # => 1
这是对这种行为的确认,但没有解释: http://makandracards.com/makandra/20641-careful-when-calling-a-ruby-block-with-an-array
【问题讨论】:
-
如果你想改进你的问题,
join...只会让它变得不必要的复杂。这与你的问题无关。您应该做的就是在每个块中执行p ids,并明确它的不同之处。 -
可能与
proc是标准库方法而lambda是特殊关键字有关... -
@sawa 感谢您的建议!
-
认为你必须新建一个 Proc?
-
ruby-doc.org/core-2.1.1/Proc.html#method-i-lambda-3F(它被称为技巧),并不是对“为什么?”的真正答案,而是一个很好的解释。
标签: ruby lambda block proc splat