В Ruby также есть итераторы.
Основное использование:
>> iter = [0,1,2,3].each #=> #<Enumerator: [0, 1, 2, 3]:each>
>> iter.next #=> 0
>> iter.next #=> 1
>> iter.next #=> 2
>> iter.next #=> 3
>> iter.next
StopIteration: iteration reached an end
from (irb):6:in `next'
from (irb):6
from /Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/irb:16:in `<main>'
>>
Вы можете использовать это в методе:
def iter(ary)
ary.each do |i|
yield i
end
end
iter([1,2,3]) { |i| puts i}
# >> 1
# >> 2
# >> 3
Ваш код Ruby терпит неудачу, потому что a
не находится в области видимости, другими словами, Ruby не видит a
внутри метода b
. Типичный способ, которым это было бы определено, - то, как я показываю это выше. Итак, ваш код близок.
Также обратите внимание, что мы редко пишем цикл for / в Ruby. Существуют такие причины, как циклы for
, оставляющие локальную переменную после выполнения, и возможность запуска с конца массива, если цикл определен неправильно, например, если вы создаете индекс для доступа к отдельным элементам массив. Вместо этого мы используем итератор .each
, чтобы возвращать каждый элемент по очереди, делая невозможным выход из конца и не оставляя после себя локальную переменную.