在Ruby中,$stdout
(前面带有一个美元符号)和STDOUT
(所有大写字母)之间有什么区别?执行输出重定向时,应使用哪个?为什么?这同样适用于$stderr
和STDERR
。
编辑:刚刚找到一个相关的问题。
Answers:
$stdout
是代表当前标准输出的全局变量。 STDOUT
是代表标准输出的常量,通常是的默认值$stdout
。
随着STDOUT
是恒定的,你不应该重新定义它,但是,你可以重新定义$stdout
没有错误/警告(重新定义STDOUT
将引发警告)。例如,您可以执行以下操作:
$stdout = STDERR
这同样适用于$stderr
与STDERR
因此,要回答问题的另一部分,请使用全局变量重定向输出,而不是常量。只需小心地在代码中进一步更改它,重新定义全局变量可能会影响应用程序的其他部分。
$>
,而不是缺省输出流$stdout
。
IO#reopen
中的情况下$stdout
?我完全不同意这种观点。该$stdout.reopen
方法会更改其接收者,并且STDOUT
如果您$stdout
之前没有重新分配它,也会影响它。它们并不意味着是同义词,当它们由于赋值而持有不同的值时,并通过重新打开STDOUT
就打破了它的目的,这也不错。
STDOUT
是全局常量,因此不应更改。 $stdout
是预定义变量,因此可以更改。如果您使用外壳进行重定向:
$ ruby test.rb > test.log
那么在执行脚本之前确定使用哪个文件作为脚本的文件描述符并不重要。
但是,如果您要尝试从Ruby脚本中更改操作系统的STDOUT的文件描述符,例如根据一周中的当前日期将输出发送到轮换的日志文件集,则需要确保你用$stdout
。
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
两者$stdout
和STDOUT
具有不同的含义。 Ruby的文档对此主题非常清楚:
$stdout
–当前标准输出。STDOUT
–标准输出。$ stdout的默认值。
要写入标准输出时,实际上是指当前的标准输出,因此应写入$stdout
。
STDOUT
也不是没有用。它存储的默认值$stdout
。如果您曾经进行过重新分配$stdout
,则可以使用将其恢复到以前的值$stdout = STDOUT
。
此外,还有一个预定义的变量:
$>
–打印的默认输出printf,$stdout
默认情况下为默认值。
但是,看起来在Ruby 2.3中,它只是充当的别名$stdout
。重新分配会$stdout
更改的值,$>
反之亦然。