Что “для” в Ruby

23
задан David Nehme 10 April 2012 в 01:02
поделиться

3 ответа

Это - почти сахар синтаксиса. Одно различие - то, что, в то время как for использовал бы объем кода вокруг этого, each, создает отдельный объем в его блоке. Сравните следующее:

for i in (1..3)
  x = i
end
p x # => 3

по сравнению с

(1..3).each do |i|
  x = i
end
p x # => undefined local variable or method `x' for main:Object
46
ответ дан sawa 29 November 2019 в 00:59
поделиться

for просто сахар синтаксиса для each метод. Это видно путем выполнения этого кода:

for i in 1 do
end

Это приводит к ошибке:

NoMethodError: undefined method `each' for 1:Fixnum
14
ответ дан the Tin Man 29 November 2019 в 00:59
поделиться

Для просто синтаксический сахар.

От кирка :

Для... В [1 121]

Ранее мы сказали, что единственные встроенные примитивы цикличного выполнения Ruby были то, в то время как и до. Что это ''для'' вещи, тогда? Ну, для почти глыба синтаксического сахара. Когда Вы пишете

for aSong in songList
  aSong.play
end

, Ruby переводит его во что-то как:

songList.each do |aSong|
  aSong.play
end

единственной разницей между для цикла и каждой формы является объем локальных переменных, которые определяются в теле. Это обсуждено на странице 87.

, для которой можно использовать выполнить итерации по любому объекту, который отвечает на метод каждый, такой как Массив или Диапазон.

for i in ['fee', 'fi', 'fo', 'fum']
  print i, " "
end
for i in 1..3
  print i, " "
end
for i in File.open("ordinal").find_all { |l| l =~ /d$/}
  print i.chomp, " "
end

производит:

fee fi fo fum 1 2 3 second third

, пока Ваш класс определяет разумное каждый метод, можно использовать для цикла для пересечения его.

class Periods
  def each
    yield "Classical"
    yield "Jazz"
    yield "Rock"
  end
end


periods = Periods.new
for genre in periods
  print genre, " "
end

производит:

Classical Jazz Rock

Ruby не имеет других ключевых слов для пониманий списка (как пример суммы, который Вы сделали выше). for не ужасно популярное ключевое слово, и синтаксис метода (arr.each {}) обычно предпочитается.

9
ответ дан rampion 29 November 2019 в 00:59
поделиться