在Ruby中每个自动计数器?


134

我想使用for-for和counter:

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

有更好的方法吗?

注意:我不知道blahs是数组还是散列,但是必须这样做blahs[i]不会使其变得更性感。我也想知道如何i++用Ruby 编写。


从技术上讲,Matt和Squeegy的回答排在第一位,但是我给paradoja最好的答案,所以在SO上的要点分散了一些。他的答案也有关于版本的注释,该注释仍然有用(只要我的Ubuntu 8.04使用的是Ruby 1.8.6)。


应该使用puts "#{i} #{blah}"更简洁的方法。


Ruby中没有增量运算符。您在此处写下的n + = 1最接近。对于n + = 1,它必须是语法糖,而对于n = n + 1,它本身就是简写。++的想法被拒绝了,因为它掩盖了您正在重新分配变量的事实。rubyurl.com/Dsb1
Chuck,

真好!谢谢查克。我被迫用Java学习++ i和i ++,所以我只是以为它会永远存在。
丹·罗森斯塔克

Answers:


190

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

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
值得注意的是,这是1.9中的新功能。
扎克·兰利

1
发现得好。实际上,它也在1.8.7中,但是值得添加。
paradoja

如果我刚刚在Ubuntu上安装了整个程序,为什么要使用Ruby 1.8.6?是1.8.7实验版/测试版吗?
丹·罗森斯塔克

您正在使用哪个Ubuntu?在无畏号中有1.8.7。这是最后一个稳定的版本(ruby-lang.org/en/downloads)。您可能,但是,猴补丁红宝石1.8.6有相同的行为(见strictlyuntyped.com/2008/09/ruby-187s-enumerator-class.html)。
paradoja

3
我已经厌倦了发行的落后,所以我开始使用rvm在Ubuntu和Linux Mint上管理Ruby安装。
Tin Man 2010年

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

您不能使用for。无论如何,我通常都喜欢对每个人进行更具声明性的通话。部分原因是当您达到for语法的限制时,它易于转换为其他形式。


很好,我明白了for语法的局限性。我必须习惯于使用多个参数进行阻止。
丹·罗森斯塔克

11

是的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块“平均”-这些是基本的ruby构造,并且即时地学习它们将是非常非常痛苦的。:)最好硬着头皮,花几个小时阅读!
马特·罗吉什

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

1
'%s %s' % [1, "two"]Ruby文档中的答案中,我在哪里可以找到此代码?感谢您的帮助,并通过使用一行压缩和映射来节省垂直空间。
丹·罗森斯塔克

1
在这种情况下,%符号运算符是String类的方法。您可以在ruby-doc.org/core/classes/String.html#M000770上阅读有关内容。或者,您可以在命令提示符下键入ri String#%。或者,您可以键入ri%以查看所有记录的识别该类的类,例如,在ri Fixnum#%处更熟悉的含义。
乔治2010年

4

关于您的问题i++,好的,您不能在Ruby中完成。i += 1您拥有的陈述正是您应该如何做的。



1

如果blahs是在Enumerable中混合的类,则应该能够做到这一点:

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

1

如果要获取每个的红宝石指数,则可以使用

.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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.