如何跟踪ruby,block,for,each中的计数器变量

时间:2011-01-04 00:14:00

标签: ruby loops variables counter

我忘了如何跟踪Ruby中循环的位置。通常我用JavaScript,AS3,Java等编写。

each

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

for

同样的事情

while

同样的事情

block

Word.each  {|w,x| }

这个我真的不知道。

3 个答案:

答案 0 :(得分:8)

除了Ruby 1.8的Array#each_with_index方法之外,Ruby 1.9中的许多枚举方法在没有块的情况下调用时返回一个Enumerator;然后,您可以调用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_indexselect.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 }

答案 1 :(得分:5)

如果您使用each_with_index而非each,则会获得索引以及元素。所以你可以这样做:

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

对于while循环,您仍需要自己跟踪计数器。

答案 2 :(得分:3)

大写W意味着它是一个常数,很可能意味着它是一个类或一个模块而不是一个类的实例。我猜你可以让一个类使用每个类返回一个枚举,但这看起来非常奇怪。

要删除令人困惑的额外垃圾和可能不正确的大写示例,我会让我的代码看起来像这样。

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

我不确定Sepp2K对奇怪的(字,x)做了什么。