Как заставить мой код запомнить текущую позицию и в следующий раз показать следующий элемент? - PullRequest
0 голосов
/ 22 ноября 2010

В Python используется iter() следующим образом:

>>> a=[1,2,4]
>>> b=iter(a)
>>> b.next()
1
>>> b.next()
2
>>> b.next()
4
>>> b.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 

Имеет ли Ruby такую ​​же функцию?

Я пробовал это, но, похоже, есть проблема:

ruby-1.9.2-p0 > a=[1,2,3]
 => [1, 2, 3] 
ruby-1.9.2-p0 > def b()
ruby-1.9.2-p0 ?>  for i in a
ruby-1.9.2-p0 ?>    yield i
ruby-1.9.2-p0 ?>    end
ruby-1.9.2-p0 ?>  end
 => nil 
ruby-1.9.2-p0 > b
NameError: undefined local variable or method `a' for #<Object:0xb7878950>

Почему Ruby не нашел переменную a?

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

В 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, чтобы возвращать каждый элемент по очереди, делая невозможным выход из конца и не оставляя после себя локальную переменную.

1 голос
/ 22 ноября 2010
[1,2,4].each { |i| puts i }
1 голос
/ 22 ноября 2010

Работа с кодом, который вы предоставили, и при условии, что вы хотите, чтобы значения были распечатаны:


a = [1, 2, 3]
def b(a)
  a.each { |i| puts i }
end
b(a)

(Есть намного лучшие способы, как указали Марк Томас )

...