将 proc 作为块传递给方法
Passing a proc as a block to a method
当我尝试将任意块传递给 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
任何人都可以解释这种行为吗?如何将任意块传递给前两个示例?
&
参数前缀将参数转换为方法块(通过对其调用 to_proc
)。因为它是一个参数,所以如果你使用它们,它必须放在括号内,即
%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 }
当我尝试将任意块传递给 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
任何人都可以解释这种行为吗?如何将任意块传递给前两个示例?
&
参数前缀将参数转换为方法块(通过对其调用 to_proc
)。因为它是一个参数,所以如果你使用它们,它必须放在括号内,即
%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 }