写STDOUT后何时使用flush?

时间:2015-07-23 17:17:28

标签: ruby

我知道flush的作用。它将数据存储在缓冲区中并将其写入标准输出以清空缓冲区。但是我不清楚何时需要这样做(不应该由翻译自动进行刷新)。我正在阅读Ruby Programming Language一书,它给出了套接字服务器的例子:

require 'socket'

host, port = ARGV
 begin 
     STDOUT.print "Connnecting..."
     STDOUT.flush
     s = TCPSocket.open(host,port)
     STDOUT.puts "done"

     local, peer = s.addr, s.peeraddr
     STDOUT.print "Connected to #{peer[2]}:#{peer[1]}"
     STDOUT.print "Using local port #{local[1]}"

     begin
         sleep(0.5)
         msg = s.read_nonblock(4096)
         STDOUT.puts msg.chop
     rescue SystemCallError
     end

     loop do
         STDOUT.print '> '
         STDOUT.flush
         local = STDIN.gets
         break if !local

         s.puts(local)
         s.flush

         response = s.readpartial(4096)
         puts(response.chop)
     end
 rescue
     puts $!
 ensure
     s.close if s
 end

为什么我们在写“连接”到STDOUT后调用flush,但是在向STDOUT写“完成”之后我们不调用flush?这似乎是武断的。这就是我的困惑所在。

1 个答案:

答案 0 :(得分:2)

确保"连接......"在可能长时间运行的事情发生之前打印出来。

一旦您将其连接起来,获得即时反馈就不那么重要了,并且在">"打印字符以响应读取数据。