Ruby中$stdout和stdout的区别



在Ruby中,$stdout(前面有一个美元符号)和STDOUT(全部大写)之间有什么区别?在执行输出重定向时,应该使用哪个,为什么?$stderrSTDERR也一样。

编辑:刚找到一个相关的问题。

$stdout是一个全局变量,表示当前的标准输出。STDOUT是一个常量,表示标准输出,通常是$stdout的默认值。

由于STDOUT是一个常量,你不应该重新定义它,然而,你可以重新定义$stdout而不会出现错误/警告(重新定义STDOUT将引发警告)。例如,可以这样做:

$stdout = STDERR

$stderrSTDERR也一样


所以,要回答你问题的另一部分,使用全局变量来重定向输出,而不是常量。只是要小心在代码的后面更改它,重新定义全局变量可能会影响应用程序的其他部分。

$stdoutSTDOUT含义不同。Ruby的文档对这个主题非常清楚:

  • $stdout -当前标准输出。
  • STDOUT -标准输出。$stdout的默认值

当您想写入标准输出时,那么您实际上是指当前标准输出,因此您应该写入$stdout

STDOUT也不是没用的。它存储$stdout的默认值。如果您重新分配了$stdout,那么您可以使用$stdout = STDOUT将其恢复为先前的值。

此外,还有一个预定义变量:
  • $> -打印的默认输出printf,默认为$stdout

然而,在Ruby 2.3中,它看起来只是作为$stdout的别名。重新分配$stdout会改变$>的值,反之亦然

  • STDOUT是一个全局常量,所以不应该修改。
  • $stdout是预定义变量,可以修改。

如果您正在使用shell进行重定向:

$ ruby test.rb > test.log

那么在脚本执行之前,您使用哪个作为脚本的文件描述符并不重要。

但是,如果您试图在Ruby脚本中更改操作系统STDOUT的文件描述符,例如将输出发送到基于当前星期几的旋转日志文件集,那么您将需要确保使用$stdout