尝试将方法用作`& my_method`之类的块时,ArgumentError(0表示1)

时间:2015-09-16 21:29:13

标签: ruby proc

假设我使用此方法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?的实施比这更复杂。

1 个答案:

答案 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]