Ruby的puts命令没有实时输出

3

我在欧拉计划上开始了一些问题。其中之一是:

13195的质因数是5、7、13和29。 求出600851475143这个数的最大质因数。

我写了一些代码...而且它可以工作:

class Integer

  def primeFactors
  load('/home/arseno/ruby/lib/prime.rb')
  a = []

    for i in (1..self)
      div = self.to_f/i.to_f
      if((div==div.to_i)&&(Prime.prime?(i)))
        a << i
      end
    end
  a
  end
end

puts 13195.primeFactors

输出:

5
7
13
29

到目前为止都很好!现在,当我输入600851475143时,我的终端机挂起了(理所当然,它正在计算大量的东西!)因此,我尝试在循环/ if中放置puts i,以便我能够实时地捕获它迭代时的输出。

但是通过将这个puts i放入循环中,Ruby不会在迭代过程中输出变量;相反,它会将值保存在某种缓冲区中,并在计算完成时刷新它们。
这个特定的问题对于Ruby来说需要很长时间才能计算出结果(已经运行了10分钟),我怀疑是浮点转换的问题。
为什么Ruby(我的终端?)要等到计算结束才释放这些值?我能否实时查看它找到的值?你有更好的方法吗?
1个回答

13

尝试添加STDOUT.sync = true。你也可以在puts后尝试使用STDOUT.flush。这里提供更多信息链接


这并不是什么惊人的事情,它是许多编程语言的标准部分。在Perl中,它将是全局变量 $|。为了提高速度,无论是写入磁盘还是屏幕,I/O都是缓冲的。该缓冲可能会导致部分写入的问题,因此我们经常关闭它,以便尽快将数据写入磁盘或其目的地。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接