23

ルビーの場合:

for i in A do
    # some code
end

以下と同じです:

A.each do |i|
   # some code
end

forはカーネルメソッドではありません:

  • forruby の" " とは正確には何ですか
  • 他のキーワードを使用して同様のことを行う方法はありますか?

何かのようなもの:

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

へのマッピング:

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

3 に答える 3

46

それはほとんど構文糖です。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
于 2008-09-30T23:15:49.217 に答える
14

forメソッドの単なる構文糖衣ですeach。これは、次のコードを実行することで確認できます。

for i in 1 do
end

これにより、次のエラーが発生します。

NoMethodError: undefined method `each' for 1:Fixnum
于 2008-09-30T23:04:56.217 に答える
9

For は単なるシンタックス シュガーです。

つるはしより:

のために...で

前に、組み込みの Ruby ループ プリミティブは while と until だけだと言いました。では、この「ための」ものは何ですか? まあ、 for はほとんどシンタックス シュガーの塊です。あなたが書くとき

for aSong in songList
  aSong.play
end

Ruby はそれを次のように変換します。

songList.each do |aSong|
  aSong.play
end

for ループと each フォームの唯一の違いは、本体で定義されているローカル変数のスコープです。これについては 87 ページで説明しています。

for を使用して、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

クラスが適切な each メソッドを定義している限り、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 には、リスト内包表記用の他のキーワードはありません (上で作成した sum の例のように)。 forはそれほど一般的なキーワードではなく、メソッド構文 ( arr.each {}) が一般的に好まれます。

于 2008-09-30T23:11:04.550 に答える