简单 Ruby Proc with (&:)

Simple Ruby Proc with (&:)

简单的问题,我已经 运行 多次了解这个 select(&:even) 语法,除了一件事外,我大部分都理解它:

& 符号,对我来说,是方法名称的组成部分,好吧,一个方法名称。我不明白为什么需要符号语法来定义偶数。在一个简短的例子中:

arr = [1,2,3,4,5]
puts arr.select(&:even?)

正确选择并打印所有偶数但是,

arr = [1,2,3,4,5]
puts arr.select(&even?)

产生:

Untitled 3.rb:2:in <main>: undefined method even? for main:Object (NoMethodError)

谁能帮我理解使用 : 符号的必要性?

如“What does map(&:name) mean in Ruby?”中所述,&:whatever 语法在 proc 中转换 :whatever 方法并将其传递给调用者。

puts arr.select(&:even?)

等同于

puts arr.select { |x| x.even? }

&:whatever 有效而 &whatever 无效的原因是,在后一种情况下,Ruby 虚拟机实际上会尝试评估 whatever 并通过结果为 &,而您真正想要的是一种惰性求值。您想要的是将方法 reference/name 传递给 &,而不是执行方法本身。

你遇到的错误是因为下面的代码

puts arr.select(&even?)

可以读作

  1. 执行even?
  2. 获取return值并将其传递给&
  3. ...但是嘿...even? 未定义(注意目标是隐式的)...崩溃!