Rubyのforループの構文


87

Rubyでこのタイプのforループを実行するにはどうすればよいですか?

for(int i=0; i<array.length; i++) {

}

@johannes本を読むことは良い考えですが、Ruby 1.6に関するものではないことが望ましいです!
Andrew Grimm

ruby-docのいくつかの便利なメソッドを確認することを忘れないでください:Enumerableモジュール
Ivan Chau 2015年

回答:


118
array.each do |element|
  element.do_stuff
end

または

for element in array do
  element.do_stuff
end

インデックスが必要な場合は、次を使用できます。

array.each_with_index do |element,index|
  element.do_stuff(index)
end

15
私は特にループ内のインデックス作成を探していましたが、これらのソリューションのいずれも、それを行う方法をすぐに明らかにしません。opはコード内Array.lengthとの彼の意向...裏切ら
jheriko

6
私の答えを注意深く読んでください。インデックスが含まれているループソリューションがあります。
Eimantas 2013年

8
多くの場合、each素晴らしいです。しかし、時々私はただ伝統的なforループが欲しいだけです。時々、「ルビーの方法」は単に迷惑なことがあります。
ルーベンマルティネスジュニア

1
自分でソートを記述できるように、ルビーで手動でインデックスを設定するにはどうすればよいですか
Muhammad Umer 2015

6
次の2つの反復をスキップしたい場合はどうなりますか
Muhammad Umer 2016年

77
limit = array.length;
for counter in 0..limit
 --- make some actions ---
end

それを行う別の方法は次のとおりです

3.times do |n|
  puts n;
end

それは0、1、2を出力するので、配列イテレータのように使用することもできます

バリアントは作者のニーズにより適していると思います


29

私はこれをグーグルの「rubyforloop」のトップリンクとしてヒットし続けているので、ステップが単に「1」ではないループのソリューションを追加したいと思いました。このような場合、NumericsオブジェクトとDateオブジェクトに存在する 'step'メソッドを使用できます。これは「for」ループの近似値だと思います。

start = Date.new(2013,06,30)
stop = Date.new(2011,06,30)
# step back in time over two years, one week at a time
start.step(stop, -7).each do |d| 
    puts d
end

20

等価性は

for i in (0...array.size)
end

または

(0...array.size).each do |i|
end

または

i = 0
while i < array.size do
   array[i]
   i = i + 1 # where you may freely set i to any value
end

17
array.each_index do |i|
  ...
end

これはあまりRubyっぽくはありませんが、Rubyで質問からforループを実行するための最良の方法です。


これは素晴らしいです。答えはそうではなくeach、むしろeach_index。+1
ダンローゼンスターク2011

12

ループを一定の回数繰り返すには、次のことを試してください。

n.times do
  #Something to be done n times
end

10

配列にアクセスする必要がない場合は(単純なforループ)、uptoまたはeachを使用できます:

最大:

1.9.3p392 :030 > 2.upto(4) {|i| puts i}
2
3
4
 => 2 

各:

1.9.3p392 :031 > (2..4).each {|i| puts i}
2
3
4
 => 2..4 

8

何?2010年以降、Rubyに/ inループの罰金があるとは誰も言及していません(誰も使用していないだけです)。

ar = [1,2,3,4,5,6]
for item in ar
  puts item
end

5
.each ... doの利点の1つは、ループの最後で一時的にブロックがスコープから外れるのに対し、for ... inでは一時がスコープ内残ることです。
ウェインコンラッド

4
['foo', 'bar', 'baz'].each_with_index {|j, i| puts "#{i} #{j}"}

0

Rubyの列挙ループ構文は異なります。

collection.each do |item|
...
end

これは、「 'blockargument'を引数としてブロックを取得する配列オブジェクトインスタンス 'collection'の 'each'メソッドへの呼び出し」と読みます。Rubyのブロック構文は、1行のステートメントの場合は「do ... end」または「{...}」です。

ブロック引数 '| item |' オプションですが、指定されている場合、最初の引数はループされた列挙アイテムを自動的に表します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.