自定义Ruby枚举器支持偏移量

时间:2014-01-04 20:35:48

标签: ruby each

我有以下查询类,其行为类似于枚举器

class Query
  include Enumerable
  # ...
  def each(&block)
    @results.each do |id|
      yield @repo.find(id)
    end  
  end
end

使用上面的代码,我可以构建以下循环:

query_all.each do |x|
...
query_all.each_with_index(1) do |x, idx|

只需定义每个功能,我就可以免费获得 each_with_index 。但是,我无法工作的是:

query_all.each.with_index(1) do |x, idx|
   puts x
end

 Failure/Error: query_all.each.with_index(1) do |tag, idx|
 LocalJumpError:
   no block given (yield)

据我所知, LocalJumpError 通常与丢失的块(我提供的)相关,所以我不确定我的每个是否缺少某些参数,或者如果这次我必须定义一个新函数。

1 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为您在each内部定义了一个块,它会在内部产生。每个都可以在没有块的情况下调用(这是你正在做的事情)。如果在没有块的情况下调用该方法,则应该返回每个结果(不调用块)。

class Query
  include Enumerable
  # ...
  def each(&block)
    results = @results.map {|id| @repo.find(id)}
    if block
      results.each(&block)
    else 
      results.each
    end
  end
end