Мне нужно немного помочь в концептуализации объектов Lazy Enumerator в Ruby.Концептуализация счетчиков и ленивых счетчиков в Ruby
То, как я думаю об объекте Enumerator, представляет собой «версию с сохранением состояния» коллекции. Объект понимает, какие элементы являются частью коллекции, и каков должен быть «следующий» элемент. Это объект, который знает, что его элементы, скажем, 1, 2 и 3, уже дали 1 и 2, и поэтому он даст 3, если их попросят.
Предполагая, что эта концептуализация Enumerator верна, мне сложно провести время с помощью Lazy Enumerator. Lazy Enumerator построен из «обычного» счетчика, но он не должен заранее рассчитывать свой набор. Например, из The Ruby Way:
enum = (1..Float::INFINITY).each
lazy = enum.lazy
odds = lazy.select(&:odd)
Если Ленивый Enumerator построен от ленивого Enumerator, то как это Ленивый Enumerator ленивым, так как я делаю часть Enumerator, которая предположительно не ленивый, во-первых?
Крис уже дал хороший ответ, просто заметите, что ленивый перечислитель может быть просто построен из строгой версии, потому что даже строгий экземпляр не выполняет (пока) выполнение какой-либо оценки, а содержит только квитанцию - выражение, как будет оцениваться. Ленивая версия фактически такая же, как и строгая, только эквивалентные методы экземпляра возвращают еще один ленивый счетчик вместо конечного результата. –