使用“ yield”和“ even”时发生未定义的方法错误

时间:2018-10-22 14:22:01

标签: ruby

当我尝试如下用selectnum.even?调用方法时,

def selection(array)
  puts "This is inside the method"
  return yield(array)
end

collection = [1,2,3,4,5]
selection(collection.select) { |num| num.even? } 

我收到一个未定义的方法错误:

undefined method `even?' for #<Enumerator: [1, 2, 3, 4, 5]:select>  

我正在寻找数组中偶数的返回。在数组的其他示例中,我可以获得select even?组合工作。

3 个答案:

答案 0 :(得分:1)

  • System.DirectoryServices.ActiveDirectory返回一个Array#select实例(如果未分配块)
  • 然后调用Enumerator方法,将调用结果传递给selection作为参数,并将collection.select作为块
  • { |num| num.even? }函数内,您selection将该块的参数(一个yield实例)
  • 在block参数上调用Enumerator的代码块中,导致收到错误消息。

我不确定even?出了什么问题,但是如果您想自己重新实现,请执行以下操作:

collection.select(&:even?)

答案 1 :(得分:0)

yield(array)一次将整个数组传递给该方法提供的块,因此它试图调用偶数?在阵列上。

答案 2 :(得分:0)

您看到此错误是因为要将枚举器对象传递到“选择”方法中……也就是说,“ collection.select”的结果是一个枚举器,而枚举器没有实现“偶数”方法。

我相信您正在尝试实现自己的“选择”版本。以下是一种实现您的意图的方法:“我正在寻找数组中偶数的返回。”

def selection(array)

  results = []
  for item in array do
    results << item if yield item 
  end
  results
end

collection = [1,2,3,4,5]
puts selection(collection) { |num| num.even? }

# => [2,4]

https://mixandgo.com/learn/mastering-ruby-blocks-in-less-than-5-minutes是一个很好的参考