在Ruby语言中,$stdout
(前面有一个美元符号)和STDOUT
(全部大写)有什么区别?当做输出重定向时,应该使用哪一个?为什么?$stderr
和STDERR
也是如此。
编辑:刚刚找到了一个related question。
发布于 2011-07-13 06:05:59
$stdout
是代表当前标准输出的全局变量。STDOUT
是代表标准输出的常量,通常是$stdout
的默认值。
由于STDOUT
是常量,您不应该重新定义它,但是,您可以重新定义$stdout
而不会出现错误/警告(重新定义STDOUT
将引发警告)。例如,您可以执行以下操作:
$stdout = STDERR
$stderr
和STDERR
也是如此
因此,要回答问题的另一部分,请使用全局变量来重定向输出,而不是常量。只需小心在代码中进一步更改它,重新定义全局变量可能会影响应用程序的其他部分。
发布于 2016-03-04 00:37:21
$stdout
和STDOUT
都有不同的含义。Ruby's documentation在这个话题上说得很清楚:
$stdout
-当前标准output.STDOUT
-标准输出。$stdout的默认值。当您想要写入标准输出时,实际上是指当前的标准输出,因此您应该写入$stdout
。
STDOUT
也不是一无是处。它存储$stdout
的默认值。如果您重新分配了$stdout
,则可以使用$stdout = STDOUT
将其恢复为以前的值。
此外,还有一个预定义的变量:
printf -打印的默认输出,
$>
,默认情况下为$stdout
。然而,在Ruby2.3中,它看起来只是作为$stdout
的一个别名。重新分配$stdout
会更改$>
的值,反之亦然。
发布于 2011-07-13 06:24:29
STDOUT
是全局常量,因此不应更改。$stdout
是预定义变量,因此可以更改。如果您使用shell进行重定向:
$ ruby test.rb > test.log
然后,在脚本执行之前确定使用哪个文件描述符作为脚本的文件描述符都无关紧要。
但是,如果您试图从Ruby脚本中更改OS的STDOUT的文件描述符,例如根据一周中的当前日期将输出发送到一组循环的日志文件,那么您将需要确保使用$stdout
。
https://stackoverflow.com/questions/6671716
复制相似问题