Что дальше в Python () в Ruby? - PullRequest
0 голосов
/ 21 февраля 2019

Я сейчас изучаю Ruby и немного потерян.

Этот фрагмент Python:

n = iter([1,2,3,4,5])
for x in n:
  print(x)
  y = next(n)
  print(y)

дает:

1
2
3
4
5

И я пытаюсьсделать то же самое в Ruby, который не работает:

n = [1,2,3,4,5].each

for x in n do
  puts x
  y = n.next()
  puts y
end

Как мне написать пример Python на Ruby?

Ответы [ 5 ]

0 голосов
/ 21 февраля 2019

В Python итератор n, полученный с использованием функции iter () , может быть использован один раз .

array = [1,2,3,4,5]
n = iter(array)

for x in n:
  print(x)

# 1
# 2
# 3
# 4
# 5

Еслизатем вы вызываете next(n), вы получаете не вывод, а ошибку: StopIteration .Если вы попытаетесь повторить n снова, вы не получите никакого вывода (без ошибки, цикл for обрабатывает исключение).

Но вы можете перебрать массив:

for x in array:
  print(x)

Если вы проверьте вывод кода, подобного вашему , вы получите:

n = iter([1,2,3,4,5])
for x in n:
  print('odd_', x)
  y = next(n)
  print('even', y)

# odd_ 1
# even 2
# odd_ 3
# even 4
# odd_ 5

# StopIteration

Как указано @toniedzwiedz Object # to_enum является эквивалентом для Python iter()так что вы можете вызвать Enumerator # next на нем.

В Ruby вы можете потреблять более одного раза перечислитель:

array = [1, 2, 3, 4, 5]
n = array.to_enum
# n = array.each # each returns an Enumerable

for x in n do
    puts x
end

for x in n do
    puts x
end

Так какВы можете потреблять более одного раза счетчик , вы получаете «двойной» вывод :

for x in n do
    p x
    p n.next
end

Или используя Array # каждый :

n.each do |x| # same as array.each.each
  p x
  p n.next
end

Также в Ruby вы достигаете конца сигнала итерации:

6.times do
  p n.next
end
# `next': iteration reached an end (StopIteration)
0 голосов
/ 21 февраля 2019

У вас правильная идея, за исключением того, что Ruby внутренне отслеживает положение счетчика.Попробуйте это:

enum = [1,2,3,4,5].each
  #=> #<Enumerator: [1, 2, 3, 4, 5]:each>    
loop do
  puts enum.next
  puts enum.next
end
1
2
3
4
5

Перечислитель # следующий вызывает исключение StopInteration , когда вызывается после того, как все элементы перечислителя enum были сгенерированы. Kernel # loop обрабатывает исключение, прерывая цикл.

Обратите внимание, что Array # каждый без дополнительного блока имеет тот же эффект, что и Объект # to_enum .Кроме того, хотя авторы книг по Ruby считают обязательным охватывать циклы for (по-видимому, на первой странице), они никогда не используются на практике.

0 голосов
/ 21 февраля 2019

Если вы ищете прямой эквивалент итератора Python , вы должны проверить Enumerator#next для очень похожего API

arr = [1, 2, 3].to_enum
#<Enumerator: [1, 2, 3]:each>
arr.next
# 1

for x in arr do
    puts x
    puts arr.next
end

#1
#2
#2
#3
#3
#StopIteration: iteration reached an end

0 голосов
/ 21 февраля 2019

each_cons - это то, что вам нужно.Но у этого метода есть недостаток: current не будет печатать последний элемент массива.Пожалуйста, имейте это в виду.

[1,2,3,4,5].each_cons(2) { |current,next_val| puts next_val }
0 голосов
/ 21 февраля 2019

Вы просто пытаетесь напечатать каждый элемент массива?

[1,2,3,4,5].each {|n| puts n}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...