是否有更惯用的方式来表达循环中剩余的迭代次数?

时间:2014-10-12 18:15:54

标签: ruby loops iteration idioms

我正在写这样的Ruby循环:

iterations = 10

until iterations == 0
    unless iterations == 1
      puts "#{iterations} iterations until done"
    else
      puts "#{iterations} iteration until done"
    end

    iterations -= 1
end

puts "Done"

我想知道是否有更多" Ruby方式"优化/编写此代码。有人有什么想法吗?

3 个答案:

答案 0 :(得分:8)

10.downto(1) do |iteration|
  puts "#{iteration} iteration#{'s' if iteration > 1} until done"
end
puts 'Done'

答案 1 :(得分:2)

require 'active_support/inflector'

10.downto(1).each { |i| puts "#{i} #{'iteration'.pluralize(i)} until done" }
puts 'Done'

答案 2 :(得分:0)

使用范围对象计算 Up

如果您不需要向后计数,可以通过迭代Range对象进一步简化。例如:

(1..10).each { |i| puts "#{i} iterations completed" }

这将打印:

1 iterations completed
2 iterations completed
3 iterations completed
4 iterations completed
5 iterations completed
6 iterations completed
7 iterations completed
8 iterations completed
9 iterations completed
10 iterations completed

反转范围

如果您已经有一个Range对象并且想要倒计时而不必调用Integer#downto,您也可以反转Range。例如:

(1..10).to_a.reverse.each  { |i| puts i }