我在.each循环中处理1000个用户对象。在.each循环中处理1000个行,如何每100个项目输出一个放置消息?
我想向控制台输出一个反馈消息。
我该怎么做,什么是Ruby模数运算符?
我尝试:
if u.id % 100
puts u.id.to_s
end
我在.each循环中处理1000个用户对象。在.each循环中处理1000个行,如何每100个项目输出一个放置消息?
我想向控制台输出一个反馈消息。
我该怎么做,什么是Ruby模数运算符?
我尝试:
if u.id % 100
puts u.id.to_s
end
尝试是::-)
if u.id % 100 == 0
puts u.id.to_s
end
我喜欢这个代码高尔夫:) – 2011-11-17 01:45:49
枚举对象序列,并检查指数%100等于99(或0和之间的某个其它值包括99)。
这将循环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
测试。
可以使用.each_slice
代替.each
:
rows.each_slice(100) do |slice|
slice.each do |row|
....
end
puts message
end
你有正确的想法,但在Ruby中是 “falsey” 的唯一的东西是'FALSE'和'Nil'。 “0”实际上是“truthy”,这就是为什么你需要明确检查模数是否等于零的原因,正如Philip所做的那样。此外,你的想法可以为每100个项目输出99个输出,而不是每100个项目输出一个。 – 2010-11-18 03:42:55