2010-11-18 37 views
0

我在.each循环中处理1000个用户对象。在.each循环中处理1000个行,如何每100个项目输出一个放置消息?

我想向控制台输出一个反馈消息。

我该怎么做,什么是Ruby模数运算符?

我尝试:

if u.id % 100 
    puts u.id.to_s 
end 
+2

你有正确的想法,但在Ruby中是 “falsey” 的唯一的东西是'FALSE'和'Nil'。 “0”实际上是“truthy”,这就是为什么你需要明确检查模数是否等于零的原因,正如Philip所做的那样。此外,你的想法可以为每100个项目输出99个输出,而不是每100个项目输出一个。 – 2010-11-18 03:42:55

回答

7

尝试是::-)

if u.id % 100 == 0 
    puts u.id.to_s 
end 
+1

我喜欢这个代码高尔夫:) – 2011-11-17 01:45:49

0

枚举对象序列,并检查指数%100等于99(或0和之间的某个其它值包括99)。

5

这将循环2000次时,输出一个标准的肥胖型消息每100个循环:

1.upto(2000).with_index do |j,i| 
    print "line #{i}\r" if (i % 100 == 0) 
end 
print "\ndone\n" 

替代那种进度指示器的是:

print '.' if (i % 100 == 0) 

或一个简单的离心器:

spinner = %w[ |/- \\ ] 
1.upto(n).with_index do |j,i| 
    print spinner.rotate![0], "\r" if (i % 100 == 0) 
    # some long running task 
end 
print "\ndone\n" 

注意 - 如果您的.id来自通过读取数据库中的一行创建的ActiveRecord对象,如果您的排序不基于id列,则循环时可能会得到大幅变化的输出。另外,如果你的数据库已经存在了一段时间,并且你已经删除了行,你可能有id数字的空缺。最终的结果是你的“每100个”可能是非常不准确的。

我建议你不比较id,而使用你增加你循环一个独立的变量,或使用each_with_index或可枚举的with_index为您提供始终如一的递增的数字,你可以使用你的% 100 == 0测试。

1

可以使用.each_slice代替.each

rows.each_slice(100) do |slice| 
    slice.each do |row| 
     .... 
    end 
    puts message 
end 
相关问题