将proc作为块传递给方法

时间:2016-04-09 12:13:54

标签: ruby proc

当我尝试将任意块传递给each_with_object方法时,会引发错误:

%w(foo bar baz).each_with_object([]) &->(i,m) { m << i.upcase }
# => NoMethodError: undefined method `&' for #<Enumerator: ["foo", "bar", "baz"]:each_with_object([])>

当我尝试将块传递给inject方法时,它也会引发错误:

%w(foo bar baz).inject('') &->(m,i) { m + i.upcase }
# => NoMethodError: undefined method `' for "foo":String

但如果我没有传递初始值,它就有用了:

%w(foo bar baz).split.inject &->(m,i) { m + i.upcase }

当我将块传递给each方法时,它也有效。

%w(foo bar baz).each &->(i) { puts i.upcase }
# FOO
# BAR
# BAZ

任何人都可以解释这种行为吗?如何将任意块传递给前两个示例?

1 个答案:

答案 0 :(得分:5)

&参数前缀将参数转换为方法块(通过调用to_proc)。因为它是一个论据,如果你使用它们,它必须进入parens,即

%w(foo bar baz).each_with_object([], &->(i,m) { m << i.upcase })

目前,ruby正在将&解释为二元运算符,并试图这样做:

(%w(foo bar baz).each_with_object([])  & (->(i,m) { m << i.upcase }))

因此错误。我不确定你为什么不只是这样做:

%w(foo bar baz).each_with_object([]) { |m,i| m << i.upcase }