2011-01-04 12 views
5

Rubyでループの位置を追跡する方法を忘れる。通常、私はruby​​、block、for、each、doのカウンター変数を追跡する方法

eachなど、ジャワ、JavaScriptでAS3を書く:

counter = 0 
Word.each do |word,x| 
    counter += 1 
    #do stuff 
end 

for

同じこと

while

同じこと

block

Word.each {|w,x| } 

これは本当にわかりません。

+0

あなたの質問はありますか?あなたが何を求めているのか分かりません。 –

+0

ああ、私はそれが曖昧であることを知っていました。カウンター変数の追跡方法 – s84

答えて

8

Ruby 1.8のArray#each_with_indexメソッドに加えて、Ruby 1.9の多くの列挙メソッドは、ブロックなしで呼び出されたときに列挙子を返します。あなたは、列挙子は、インデックスに沿って渡す持っているwith_indexメソッドを呼び出すことができます。

irb(main):001:0> a = *('a'..'g') 
#=> ["a", "b", "c", "d", "e", "f", "g"] 

irb(main):002:0> a.map 
#=> #<Enumerator:0x28bfbc0> 

irb(main):003:0> a.select 
#=> #<Enumerator:0x28cfbe0> 

irb(main):004:0> a.select.with_index{ |c,i| i%2==0 } 
#=> ["a", "c", "e", "g"] 

irb(main):005:0> Hash[ a.map.with_index{ |c,i| [c,i] } ] 
#=> {"a"=>0, "b"=>1, "c"=>2, "d"=>3, "e"=>4, "f"=>5, "g"=>6} 

あなたはRubyのは1.8.xの下map.with_indexまたはselect.with_index(など)をしたい場合は、この退屈な-ブトを行うことができますいずれか速い方法:

i = 0 
a.select do |c| 
    result = i%2==0 
    i += 1 
    result 
end 

か、それ以上の機能の楽しみを持つことができます。

a.zip((0...a.length).to_a).select do |c,i| 
    i%2 == 0 
end.map{ |c,i| c } 
5

eachの代わりにeach_with_indexを使用すると、要素とともにインデックスが取得されます。だから、行うことができます:あなたはまだカウンタ自分を追跡する必要があります

Word.each_with_index do |(word,x), counter| 
    #do stuff 
end 

ループwhileについて。

+0

これは私が探しているものですが、それらのすべての大きな写真です。 – s84

+1

@サム:あなたはどんな種類の大きな写真を意味するのかよく分かりません。 – sepp2k

+0

笑、私は覚えていないと思います。私は、ループ内のカウンタを初期化することができますが、カウンタがちょうどそこにあるはずなので、これは直感的ではないように見えます。いいえ? – s84

3

資本Wは、それが最も可能性が高いことがあります意味する定数です意味しますクラスのインスタンスではないクラスまたはモジュール。私はクラスをそれぞれを使って列挙型に戻すことができると思いますが、それは非常に奇妙なようです。

混乱している余分なジャンクと恐らく大文字の間違った例を削除するには、私のコードをこのように見せてください。

words = get_some_words() 
words.each_with_index do |word, index| 
    puts "word[#{index}] = #{word}" 
end 

Sepp2Kが奇妙な(単語、x)で何をしているのか分かりません。

関連する問題