我想使用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}"
更简洁。
答案 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