Это - почти сахар синтаксиса. Одно различие - то, что, в то время как 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
for
просто сахар синтаксиса для each
метод. Это видно путем выполнения этого кода:
for i in 1 do
end
Это приводит к ошибке:
NoMethodError: undefined method `each' for 1:Fixnum
Для просто синтаксический сахар.
От кирка :
Для... В [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 {}
) обычно предпочитается.