Недавно я начал читать книгу "Programming Ruby 1.9&2.0". Он показывает трюк для явного перечислителя
triangular_numbers = Enumerator.new do |yielder|
number = 0
count = 1
loop do
number += count
count += 1
yielder.yield number
end
end
5.times { print triangular_numbers.next, " " }
puts
Интересно, почему этот yielder.yield временно покидает цикл, а также возвращает значение number до тех пор, пока не будет создан следующий объект перечислителя. Это выглядит иначе, чем в обычном случае, когда yield находится внутри блока цикла. Я проверяю APIdock и обнаруживаю, что исходный код Proc.yield() такой же, как у Proc.call(). Для объекта Yielder в классе Enumerator объект Yielder переопределяет yield(). Но почему yielder.yield временно покидает блок loop?
triangular_numbers
. Перечислитель действует как замыкание, поэтому он может запоминать значениеnumber
между вызовами. - person Max   schedule 18.09.2013