每个Ruby中的自动计数器?

时间:2009-02-10 19:40:53

标签: ruby syntax

我想使用for-each和counter:

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}"更简洁。

8 个答案:

答案 0 :(得分:188)

正如人们所说,你可以使用

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中做到这一点。

答案 1 :(得分:54)

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

你无法做到这一点。无论如何,我通常喜欢对每个人进行更多的声明性调用。部分是因为当你达到for语法的限制时,它很容易转换到其他形式。

答案 2 :(得分:10)

是的,执行循环是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}

答案 3 :(得分:6)

如果您没有新版本的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

答案 4 :(得分:4)

至于你关于做i++的问题,你不能在Ruby中做到这一点。您拥有的i += 1声明正是您应该如何做的。

答案 5 :(得分:1)

如果blahs是一个混合了Enumerable的类,你应该可以这样做:

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

答案 6 :(得分:1)

enumerating enumerable系列非常好。

答案 7 :(得分:1)

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