简单 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?)
可以读作
- 执行
even?
- 获取return值并将其传递给
&
- ...但是嘿...
even?
未定义(注意目标是隐式的)...崩溃!
简单的问题,我已经 运行 多次了解这个 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?)
可以读作
- 执行
even?
- 获取return值并将其传递给
&
- ...但是嘿...
even?
未定义(注意目标是隐式的)...崩溃!