Что такое "для" в Ruby - PullRequest
       24

Что такое "для" в Ruby

23 голосов
/ 01 октября 2008

в рубине:

for i in A do
    # some code
end

совпадает с:

A.each do |i|
   # some code
end

for не является методом ядра:

  • Что именно означает "for" в рубине
  • Есть ли способ использовать другие ключевые слова для подобных вещей?

Что-то вроде:

 total = sum i in I {x[i]}

отображение на:

 total = I.sum {|i] x[i]}

Ответы [ 3 ]

46 голосов
/ 01 октября 2008

Это почти синтаксис сахара. Одно из отличий состоит в том, что, хотя 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
14 голосов
/ 01 октября 2008

for - это просто синтаксический сахар для метода each. Это можно увидеть, запустив этот код:

for i in 1 do
end

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

NoMethodError: undefined method `each' for 1:Fixnum
9 голосов
/ 01 октября 2008

Ибо это просто синтаксический сахар.

С кирка :

Для ... В

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

for aSong in songList
  aSong.play
end

Руби переводит это как-то так:

songList.each do |aSong|
  aSong.play
end

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

Вы можете использовать для перебора любого объекта, который отвечает на метод каждого, например, Array или Range.

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 {}) обычно предпочтительнее.

...