Методы Enumerable повторяются только в том случае, если вы предоставляете блок, в противном случае они возвращают итератор , аналогичный C ++. Например, в irb
:
>> e = [1,2,3,4].each
=> #<Enumerator: [1, 2, 3, 4]:each>
>> e.next
=> 1
Хитрость в том, что .next
во многом похож на e++
в C ++, так как возвращает текущее значение и увеличивает итератор. Существует метод .rewind
, но он сбрасывает итератор в начало, а не назад только на один шаг.
Я не знаю удобного способа определения конца итератора (кроме перехвата исключения StopIteration
) или определения размера итератора.
Предположительно, вы должны захватить итератор, передать его какому-либо методу, и метод выполняет iter.each { |x| something_interesting(x) }
некоторого рода.
Итак, существуют итераторы, но вы не можете транслитерировать ваш C ++ прямо в Ruby. OTOH, вы не должны транслитерировать ваш C ++ на Ruby, вы должны написать Ruby на Ruby и C ++ на C ++.