Ruby-итератор для потока без возможности поиска - PullRequest
2 голосов
/ 27 сентября 2010

Я хочу прочитать записи данных из потока без возможности поиска в Ruby. Я хочу предоставить пользователю возможность пропустить или прочитать текущую запись. Обычно вы включаете Enumerable и предоставляете необходимые методы, чтобы иметь итератор в Ruby, но в моем случае данные могут быть пропущены и возможна только одна итерация, поэтому я не уверен, что мне следует делать.

Какой из них вы бы предпочли?

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 Ответ

1 голос
/ 28 сентября 2010

Ленивая оценка?

Звучит как хороший кандидат на ленивую оценку.

Как насчет передачи записи в блок, который реализует каждый метод доступа с ленивой оценкой и читает запись, если она используется?

Если имеется много методов доступа, вы можете просто указать метод атрибута, который проверяет, выполнена ли обработка чтения, выполняет ли это при необходимости, а затем возвращает запись.

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

Кстати, какова мотивация пропустить чтение? Скорость исполнения? Если это так, я мог бы просто попробовать это простым способом и всегда читать, просто чтобы посмотреть, достаточно ли это быстро.

...