LINUX.ORG.RU

Ruby и бесконечные Enumerators

 enumerable,


0

2

Всем привет. Сижу, вот, разбираюсь в Ruby. Набрел на такой вот пример (ниже продублирую код)

#!/usr/bin/env ruby
# Return given number of even Integers
# that have number '4' within them

even_numbers = Enumerator.new do |yielder|
  number = 0
  count = 1
  loop do
    number += count
    count += 1
    yielder.yield number
  end
end

class Enumerator
  def infinite_selector(&block)
    Enumerator.new do |yielder|
      self.each do |value|
        yielder.yield(value) if block.call(value)
      end
    end
  end
end

p even_numbers
  .infinite_selector {|val| val % 2 == 0}
  .infinite_selector {|val| val.to_s =~ /4/}
  .first(10)

В итоге получаю:

[406, 496, 946, 1540, 2346, 3240, 3486, 4186, 4278, 4560]

В свою очередь не пойму, почему пропускаются числа 4, 8, ... Почему сразу выводятся такие «большие» числа?

yielder

Какое ужасное название.

anonymous
()

А внимательно на код посмотреть?

even_numbers = Enumerator.new do |yielder|
  number = 0
  count = 1
  loop do
    number += count
    count += 1
    yielder.yield number
  end
end
geekless ★★
()
even_numbers = Enumerator.new do |yielder|
  number = 0
  count = 1
  loop do
    number += count
    count += 1
    yielder.yield number
  end
end

В цикле значение count, на которое увеличивается number, постоянно инкрементируется. И если к первому значению number добавляется сначала 1, то ко второму --- 2, к третьему --- 3 и т.д. В результате имеем следующую последовательность: 1, 3, 7, 12 и т.д. Четверками-восьмерками там и не пахнет.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

geekless, theNamelessOne

Большое спасибо! Эт я чето затупил (действительно, там же «инкрементор» в виде count сам постоянно увеличивается).

Да, там явно не «четные» цифры, а другая последовательность поэтому получается:

[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
GreenBag ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.