快速提问,我已经多次遇到这种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)
任何人都可以帮助我理解使用:
符号的必要性吗?
答案 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}当你真正想要的是一种懒惰的评价时。你想要的是将方法引用/名称传递给&
,而不是执行方法本身。
您遇到的错误是因为以下代码
&
可以读作
puts arr.select(&even?)
even?
&
没有定义(注意目标是隐含的)......崩溃!