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