用于不可搜索流的Ruby迭代器

时间:2010-09-27 19:56:46

标签: ruby iterator stream while-loop each

我想从Ruby中的不可搜索流中读取数据记录。我想让用户了解是应该跳过还是读取当前记录。通常你会包含Enumerable并提供必要的方法让它在Ruby中有一个迭代器,但在我的情况下,数据可以被跳过,只有一次迭代是可能的,所以我不确定我应该做什么。 / p>

您更喜欢哪一个?

while record = foo.next
  if bar
    foo.read
  else
    foo.skip
  end
end

foo.each do |record|
  if bar
    foo.read
  else
    foo.skip
  end
end

1 个答案:

答案 0 :(得分:1)

懒惰的评价?

听起来像懒惰评价的好候选人。

如何使用延迟评估生成一个实现每个访问者的块的记录,如果它被使用则读取记录。

如果有很多访问者,你可以产生一个属性方法来检查读取处理是否已经完成,如果有必要,然后返回记录。

foo.each do |record_manager|
  if bar
    puts record_manager.get.field1 # get does foo.read, whatever that does
    puts record_manager.get.field2 # just returns the processed object this time
  else
    # each() will do .skip() if no get() was called
  end
end

顺便说一下,跳过vs阅读的动机是什么?执行速度?如果是这样,我可能会以简单的方式尝试并始终阅读,只是为了看它是否足够快。