3

我有两个简单的脚本,读者和作家:

writer.rb

while true
  puts "hello!"
  $stdout.flush
  sleep 1
end

reader.rb

while true
  puts "I read: #{$stdin.read}!"
  sleep 1
end

writer.rb连续写入标准输出,reader.rb连续读取标准输入。

现在,如果我这样做:

ruby writer.rb | ruby reader.rb

我希望这会继续打印

I read: hello!
I read: hello!
I read: hello!

每隔一秒。但它只是阻塞而不打印任何东西。我如何让它打印?我以为writer.rb是缓存输出所以我添加了$stdout.flush,但这并没有让我到任何地方。

4

2 回答 2

3

您需要使用$stdin.gets而不是.read作为.read读取直到 EOF。

puts "I read: #{$stdin.read}!"

应该

puts "I read: #{$stdin.gets}!"

注意:这将包括换行符,因此输出将类似于:

I read: hello!
!
I read: hello!
!
I read: hello!
!

如果您不想要尾随换行符,请使用$stdin.gets.chomp

输出$stdin.gets.chomp

I read: hello!!
I read: hello!!
于 2013-05-16T06:42:46.240 回答
2

我快速浏览了 的文档read,其中指出:

如果 length 被省略或为 nil,则读取到 EOF

在您的情况下,当作者终止时会发生这种情况,预计永远不会。您可能想使用readline.

于 2013-05-16T06:36:12.673 回答