简单的Ruby Proc(& :)

时间:2015-10-13 21:16:21

标签: arrays ruby iterator symbols

快速提问,我已经多次遇到这种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)

任何人都可以帮助我理解使用:符号的必要性吗?

1 个答案:

答案 0 :(得分:2)

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

puts arr.select(&:even?)

相当于

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

&:whatever工作的原因而&whatever没有,因为在后一种情况下,Ruby虚拟机实际上会尝试评估whatever并将结果传递给{{1}当你真正想要的是一种懒惰的评价时。你想要的是将方法引用/名称传递给&,而不是执行方法本身。

您遇到的错误是因为以下代码

&

可以读作

  1. 执行puts arr.select(&even?)
  2. 获取返回值并将其传递给even?
  3. ...但是嘿...... &没有定义(注意目标是隐含的)......崩溃!