当我尝试将任意块传递给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([])>
Run Code Online (Sandbox Code Playgroud)
当我尝试将块传递给inject方法时,它也会引发错误:
%w(foo bar baz).inject('') &->(m,i) { m + i.upcase }
# => NoMethodError: undefined method `' for "foo":String
Run Code Online (Sandbox Code Playgroud)
但是如果我没有传递初始值,它就有效:
%w(foo bar baz).split.inject &->(m,i) { m + i.upcase }
Run Code Online (Sandbox Code Playgroud)
当我将块传递给each方法时,它也可以工作.
%w(foo bar baz).each &->(i) { puts i.upcase }
# FOO
# BAR
# BAZ
Run Code Online (Sandbox Code Playgroud)
谁能解释这种行为?如何将任意块传递给前两个示例?
的&参数前缀变成一个参数到方法的块(通过调用to_proc它).因为它是一个参数,如果你正在使用它们,它必须进入parens,即
%w(foo bar baz).each_with_object([], &->(i,m) { m << i.upcase })
Run Code Online (Sandbox Code Playgroud)
目前,ruby正在将其解释&为二元运算符,并尝试:
(%w(foo bar baz).each_with_object([]) & (->(i,m) { m << i.upcase }))
Run Code Online (Sandbox Code Playgroud)
因此错误.我不确定你为什么不这样做:
%w(foo bar baz).each_with_object([]) { |m,i| m << i.upcase }
Run Code Online (Sandbox Code Playgroud)