Правильный ответ уже определил «ленивый» метод, но приведенный пример оказался не слишком полезным. Я приведу лучший пример того, когда целесообразно использовать lazy с массивами. Как уже говорилось, lazy определяется как метод экземпляра модуля Enumerable, и он работает с объектами EITHER, которые реализуют модуль Enumerable (например, arrays - [] .lazy), или с перечислителями, которые возвращают значение итераторов в модуле enumerable (например, each_slice). - [] .each_slice (2) .lazy). Обратите внимание, что в модуле Enumerable некоторые методы экземпляра возвращают больше примитивных значений, таких как true или false, некоторые возвращают коллекции, такие как массивы, а некоторые возвращают перечислители. Некоторые возвращают перечислители, если блок не указан.
Но для нашего примера класс IO также имеет итератор each_line, которая возвращает перечислитель и, таким образом, может использоваться с "lazy". Прекрасная вещь в возвращении перечислителя состоит в том, что он фактически не загружает коллекцию (например, большой массив) в память, над которой он работает. Скорее, он имеет указатель на коллекцию, а затем рассказывает алгоритм (например, each_slice (2)), который он будет использовать в этой коллекции, когда вы хотите обработать коллекцию с чем-то вроде to_a
, например.
Так что, если вы работаете с перечислителем для огромного повышения производительности, теперь вы можете прикрепить ленивый к перечислителю. Таким образом, вместо перебора всей коллекции, чтобы соответствовать этому условию:
file.each_line.select { |line| line.size == 5 }.first(5)
Вы можете вызвать ленивый:
file.each_line.lazy.select { |line| line.size == 5 }.first(5)
Если мы сканируем большой текстовый файл на первые 5 совпадений, то после того, как мы находим 5 совпадений, нет необходимости продолжать выполнение. Следовательно, сила ленива с любым типом перечисляемого объекта.