【问题标题】:How to do something on every n operation in ruby loop?如何对 ruby​​ 循环中的每个 n 操作做一些事情?
【发布时间】:2013-04-18 18:00:36
【问题描述】:

所以,我有一个 ruby​​ 循环,如何在其中每 50 次迭代打印一条消息,如下所示:

loop do
  do something
  break if something happend
  puts "Message at every 50 iteration"
end

【问题讨论】:

  • 了解打破循环的条件会有所帮助。
  • 了解您在循环中所做的工作也很有帮助。很有可能还有其他方法可以做到这一点 - 如果您声明 目标 不是 实施,您可能会得到更好的答案。

标签: ruby loops


【解决方案1】:

保留一个计数变量,每次它可以被 50 整除时做一些事情。

i = 0;

loop do
  i += 1

  if i % 50 == 0
    puts "This prints every 50 iterations"
  end
end

【讨论】:

  • 因为它没有为 OP 解释:i % 50 == 0 基本上就像i 除以50 一样,只有它返回余数,所以我们可以通过查找来找到均匀的边界0,或者如果您想要边界 + 某个数字,您可以查找该数字。
  • 如果这是一个类似守护进程的进程,我还会在if 语句中重置 i 以确保不会溢出可能的最大整数值。 (我不记得在 Ruby 中是否有一个,但偏执仍然很好。)
  • @sigmavirus24:Ruby 中整数的最大值仅受表示该整数所需的内存量的限制。因此,在具有 16 GiByte RAM 的典型服务器机器上,最大整数值大约为 256**(16*1024*1024*1024),即 2**(242),即 2 4398046511104 或大约 10**1319413953331,即 10 有 13 亿个零。
  • @JörgWMittag TIL。谢谢你。 :)
【解决方案2】:

Donald Knuth(可能不在 Ruby 中)会使用倒数索引而不是递增索引。这使检查更容易。它还避免了 sigmavirus24 指出的整数溢出问题。

i = 50
loop do
  # do something
  break if something happend # (as in original)
  i -= 1
  next unless i.zero?
  i = 50
  puts "Message at every 50 iteration"
end

【讨论】:

  • 你能解释一下为什么倒计时更好吗?我很感兴趣。
  • i除以50,看看它是否为零。在i 更改时执行此操作一千次。接下来看看i 在变化时是否为零一千次。你会自愿做什么?
  • 嗯,这是一个很好的观点。此外,我看到你提到了 Donald Knuth,有什么消息来源吗?谢谢。
  • Donald Knuth TeXbook.
  • 对于一个基本上不存在的问题,该代码是一个混乱:Fixnums 溢出时会自动转换为 Bignums(其大小会动态更改以适应 技术上任何数字)。
【解决方案3】:

考虑到您的条件为c,我认为最干净的方法是使用while 循环(或unless,具体取决于条件):

while c do
    i = (i) ? i + 1 : 1
    puts "This prints every 50 iterations" if (i % 50 == 0)
end

【讨论】:

  • 这不是像 Ruby 那样写,而是像 C 或 Perl 那样写。
  • @theTinMan,仅仅因为它使用while而不是loop
  • while 很少使用,loop dorecommended。用三元初始化i 是边界线,但使用带分号的单行if 是最不像Ruby 的。 puts ... if (i % 50 == 0) 是惯用的。
  • @theTinMan,请重新阅读您的链接。它说loop 优先于begin - end while - 而不是while do。关于分号 if 我完全同意并感谢您让我注意到它。
  • while 在 Ruby 中也很少使用;请注意它在此页面上的使用频率。而且,如果您阅读blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745,在那个答案中指出,Matz 避免了do/while 循环和while 循环,建议使用loop
猜你喜欢
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2015-07-17
  • 2012-08-28
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
相关资源
最近更新 更多