Ruby中$ stdout和STDOUT的区别
在Ruby中, $stdout
(之前是美元符号)和STDOUT
(全部大写)之间有什么区别? 在做输出redirect时,应该使用哪个,为什么? $stderr
和STDERR
。
编辑:刚刚find一个相关的问题 。
$stdout
是一个代表当前标准输出的全局variables 。 STDOUT
是表示标准输出的常量 ,通常是$stdout
的默认值。
STDOUT
是一个常量,你不应该重新定义它,但是,你可以重新定义$stdout
没有错误/警告(重新定义STDOUT
会引发警告)。 例如,你可以这样做:
$stdout = STDERR
$stderr
和STDERR
所以,要回答你的问题的其他部分,使用全局variables来redirect输出,而不是常量。 只要注意在代码中进一步修改它,重新定义全局variables会影响应用程序的其他部分。
-
STDOUT
是一个全局常量,所以不应该改变。 -
$stdout
是一个预定义的variables,所以可以改变。
如果你使用shell来做redirect:
$ ruby test.rb > test.log
那么在你的脚本执行之前,你使用哪一个作为脚本的文件描述符并不重要。
但是,如果您想要从Ruby脚本中更改操作系统STDOUT的文件描述符,例如根据当前的星期几发送输出到一组旋转的日志文件,那么您需要确保你使用$stdout
。
$stdout
和STDOUT
都有不同的含义。 Ruby的文档在这个主题上非常清楚:
$stdout
– 当前的标准输出。STDOUT
– 标准输出。 $ stdout的默认值。
当你想写入标准输出的时候,你实际上是指当前的标准输出,所以你应该写入$stdout
。
STDOUT
也不是无用的。 它存储$stdout
的默认值。 如果您重新分配$stdout
,那么您可以使用$stdout = STDOUT
将其恢复到之前的值。
此外,还有一个预定义的variables:
$>
– print,printf的默认输出,默认为$stdout
。
然而,它看起来像在Ruby 2.3中,它只是作为$stdout
的别名。 重新分配$stdout
更改$>
的值,反之亦然。