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}"
を使用する必要がありました。
人々が言ったように、あなたは使用することができます
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。
[:a, :b, :c].each_with_index do |item, i|
puts "index: #{i}, item: #{item}"
end
Forでこれを行うことはできません。とにかく、私は通常、それぞれに対してより宣言的な呼び出しが好きです。一部は、for構文の制限に達したときに他のフォームに簡単に移行できるためです。
はい、それは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}
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
i++
の実行に関する質問については、Rubyではできません。あなたが持っていたi += 1
ステートメントは、まさにあなたがそれをすることになっている方法です。
enumrating enumerable シリーズはかなりいいです。
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
blahs
がEnumerableに混在するクラスである場合、これを行うことができるはずです。
blahs.each_with_index do |blah, i|
puts("#{i} #{blah}")
end