Ruby中的每个自动计数器?

我想用一个for-each和一个计数器:

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

有没有更好的方法来做到这一点?

注意:我不知道blahs是一个数组还是一个hash,但是不得不做一个blahs[i]不会让它变得更性感。 另外我想知道如何在Ruby中编写i++


从技术上讲,Matt和Squeegy的回答是首先出现的,但是我给出了最好的答案,以便在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) } 

这是你可以从ruby1.8.7和1.9做的事情。

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

你不能这样做。 我通常喜欢每个人都有更多的声明式的电话。 部分原因是当你碰到语法的限制时很容易转换到其他forms。

是的,这是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声明正是你应该如何去做的。

列举enumerable系列是相当不错的。

如果blahs是在Enumerable中混合的类,那么应该可以这样做:

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

如果你想获得每个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 

这将打印:

 abcdefghijklmnopqrstu vwxyz You are at last item