假设我使用此方法num_i_want?
,我想将其与select
一起使用来过滤我的nums
数组。
def num_i_want?(num)
num % 2 == 0
end
nums = [1, 2, 3, 4]
我尝试使用一元&符运算符将该方法用作块:
nums.select( &num_i_want? )
但是我收到了这个错误:
ArgumentError: wrong number of arguments (0 for 1)
from (irb):1:in `num_i_want?'
from (irb):6
为什么我收到此错误?我可以使用的最简单的代码是什么?
我知道&:num_i_want?
不起作用。这会尝试在每个号码上调用num_i_want?
,这会引发NoMethodError
,因为Integer#num_i_want?
不存在。
当然,我可以使用&:even?
来致电Integer#even?
,但让我们假装num_i_want?
的实施比这更复杂。
答案 0 :(得分:1)
写作时
nums.select( &num_i_want? )
您的代码实际上正在被解析为& num_i_want?()
。调用第一个num_i_want?
时不带参数,然后然后应用&符号运算符。您的问题是您无法直接通过名称引用方法。
引用方法的最简单方法是将符号传递给Object#method
:
nums.select( &method(:num_i_want?) )
#=> [2, 4]
如果您担心使用Object#method
与&
结合使代码过于聪明且难以阅读,则替代方法是传递一个仅包装num_i_want?
的正常块:< / p>
nums.select { |num| num_i_want?(num) }
#=> [2, 4]