web-dev-qa-db-ja.com

Rubyごとに?

For-eachとカウンターを使用したい:

i=0
for blah in blahs
    puts i.to_s + " " + blah
    i+=1
end

それを行うためのより良い方法はありますか?

注:blahsが配列なのかハッシュなのかはわかりませんが、blahs[i]をしなくてもそれほどセクシーになることはありません。また、Rubyでi++を書く方法を知りたいです。


技術的には、MattとSqueegyの答えが最初に出てきましたが、私はparadojaに最高の答えを出しているので、SOのポイントを少し広げました。また、彼の答えにはバージョンに関するメモがありましたが、それはまだ関連しています(私のUbuntu 8.04がRuby 1.8.6)を使用している限り)。


はるかに簡潔なputs "#{i} #{blah}"を使用する必要がありました。

131
Dan Rosenstark

人々が言っ​​たように、あなたは使用することができます

each_with_index

しかし、「each」とは異なるイテレータを持つインデックスが必要な場合(たとえば、インデックスなどとマッピングする場合)、each_with_indexメソッドで列挙子を連結するか、単にwith_indexを使用できます。

blahs.each_with_index.map { |blah, index| something(blah, index)}

blahs.map.with_index { |blah, index| something(blah, index) }

これは、Ruby 1.8.7および1.9。

188
paradoja
[:a, :b, :c].each_with_index do |item, i|
  puts "index: #{i}, item: #{item}"
end

Forでこれを行うことはできません。とにかく、私は通常、それぞれに対してより宣言的な呼び出しが好きです。一部は、for構文の制限に達したときに他のフォームに簡単に移行できるためです。

54
Alex Wayne

はい、それはcollection.eachループを実行してからeach_with_indexインデックスを取得します。

あなたはおそらくRuby本を読むべきです。なぜなら、これは基本的なRuby試してください: http://poignantguide.net/Ruby/ )。

Rubyソースコードから取得:

 hash = Hash.new
 %w(cat dog wombat).each_with_index {|item, index|
   hash[item] = index
 }
 hash   #=> {"cat"=>0, "wombat"=>2, "dog"=>1}
10
Matt Rogish

each_with_indexの新しいバージョンがない場合、 Zip メソッドを使用して、インデックスを要素とペアリングできます。

blahs = %w{one two three four five}
puts (1..blahs.length).Zip(blahs).map{|pair|'%s %s' % pair}

生成するもの:

1 one
2 two
3 three
4 four
5 five
6
George

i++の実行に関する質問については、Rubyではできません。あなたが持っていたi += 1ステートメントは、まさにあなたがそれをすることになっている方法です。

4
pope

enumrating enumerable シリーズはかなりいいです。

2
Andrew Grimm

Rubyそれぞれのインデックスを取得したい場合は、

.each_with_index

.each_with_index動作:

range = ('a'..'z').to_a
length = range.length - 1
range.each_with_index do |letter, index|
    print letter + " "
    if index == length
        puts "You are at last item"
    end
end

これは印刷されます:

a b c d e f g h i j k l m n o p q r s t u v w x y z You are at last item
1
Ilyas karim

blahsがEnumerableに混在するクラスである場合、これを行うことができるはずです。

blahs.each_with_index do |blah, i|
  puts("#{i} #{blah}")
end
1
Roy Pardee