自动计数器在红宝石为每个?

我想使用 for-each 和计数器:

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

还有更好的办法吗?

注意: 我不知道 blahs是一个数组还是一个散列,但是必须执行 blahs[i]不会使它更加性感。我还想知道如何用 Ruby 编写 i++


从技术上讲,马特和斯奎格的答案是第一个,但我给出了最好的答案似是而非,所以分散点有点在 SO 上。他的回答中还提到了版本,这仍然是相关的(只要我的 Ubuntu 8.04使用的是 Ruby1.8.6)。


应该用 puts "#{i} #{blah}"的,这样简洁多了。

78857 次浏览

是的,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}
[:a, :b, :c].each_with_index do |item, i|
puts "index: #{i}, item: #{item}"
end

你不能这样做。无论如何,我通常喜欢给每个人打一个更加直白的电话。部分原因是当遇到 for 语法的限制时,很容易转换为其他形式。

如果 blahs是一个在 Enumerable 混合的班级,你应该能够做到这一点:

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

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

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开始做的事情。

枚举可枚举的系列相当不错。

至于你关于做 i++的问题,好吧,你不能在 Ruby 中这样做。你的 i += 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

如果希望获取每个索引的 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