Что такое "за" в Ruby
В Ruby:
for i in A do
# some code
end
совпадает с:
A.each do |i|
# some code
end
for
не является методом ядра:
- Что такое "
for
" в ruby
- Есть ли способ использовать другие ключевые слова для подобных действий?
Что-то вроде:
total = sum i in I {x[i]}
отображение в:
total = I.sum {|i] x[i]}
Ответы
Ответ 1
Это почти синтаксис сахара. Одно отличие состоит в том, что, хотя 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
Ответ 2
for
- это просто синтаксический сахар для метода each
. Это можно увидеть, запустив этот код:
for i in 1 do
end
Это приводит к ошибке:
NoMethodError: undefined method `each' for 1:Fixnum
Ответ 3
Для просто синтаксического сахара.
Из кирка:
Для... В
Ранее мы говорили, что единственные встроенные примитивы Ruby looping были пока и до. Что это за "за"? Ну, это почти кусок синтаксического сахара. Когда вы пишете
for aSong in songList
aSong.play
end
Ruby переводит его во что-то вроде:
songList.each do |aSong|
aSong.play
end
Единственное различие между циклом for и каждой формой - это область локальных переменных, которые определены в теле. Это обсуждается на стр. 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
Пока ваш класс определяет разумный каждый метод, вы можете использовать цикл for для его перемещения.
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 {}
) обычно является предпочтительным.