我在这里遇到了一个非常奇怪的问题。这是使用puts的简单代码:
puts "Dale"
sleep 1
puts "Cooper"
我有3个不同的终端/控制台:
这有点奇怪:代码只在标准Windows控制台中按预期运行。类UNIX的终端正在等待1秒钟,然后才显示输出(同一时刻两条线路)。基本上,类UNIX的终端正在等待程序退出,然后它们显示输出的最终结果。
如果我用put替换puts,它不会影响执行过程。类似UNIX的终端仍会延迟输出,直到程序退出。
但接下来的两个例子适用于所有3个终端/控制台:
system("echo Dale")
sleep 1
system("echo Cooper")
这个添加了引号,但除此之外,代码按预期工作。
p "Dale"
sleep 1
p "Cooper"
话虽如此,我认为这与Ruby有关。我尝试过不同版本的Ruby。
有人可以解释为什么会发生这种情况以及绕过这个问题的可行方法是什么?
这是我回答我自己的问题。
如果您在代码之前执行puts STDOUT.sync
,那么您将看到无论您使用的是Windows控制台还是类UNIX终端,都会说STDOUT.sync设置为false。这很奇怪,因为Windows控制台会立即刷新输出,而类似UNIX的终端则不会。我不确定为什么会这样。
您可以执行STDOUT.flush
(或$stdout.flush
)来刷新缓冲区,也可以将STDOUT.sync(或$ stdout.sync)设置为true。两种变体都与Windows控制台完全友好。所以代码如下:
puts "Dale"
STDOUT.flush
sleep 1
puts "Cooper"
或更多推荐:
STDOUT.sync = true
puts "Dale"
sleep 1
puts "Cooper"
这是@eryksun建议的一个小技巧,用于了解代码是否在Windows控制台或类UNIX终端中运行。 STDOUT.isatty在Windows下运行时有点颠倒,但不过它可以解决问题。
if STDOUT.isatty
# Windows console
else
# UNIX-like terminal
end
请记住,这假设您已经知道代码是在Windows下运行的。 here描述了检查操作系统的好方法。
答案的主要来源可以找到here。答案的想法属于@eryksun。
STDOUT.sync,STDOUT.sync =(关于这种方法的question),STDOUT.flush,STDOUT.isatty。