Ruby中$ stdout和STDOUT之间的区别

时间:2011-07-12 21:59:36

标签: ruby stdout stderr output-redirect

在Ruby中,$stdout(以美元符号开头)和STDOUT(全部大写)之间有什么区别?在进行输出重定向时,应该使用哪个以及为什么? $stderrSTDERR也是如此。

修改:刚刚找到related question

3 个答案:

答案 0 :(得分:99)

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

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

$stdout = STDERR

同样适用于$stderrSTDERR


因此,要回答问题的其他部分,请使用全局变量重定向输出,而不是常量。请小心在代码中进一步更改它,重新定义全局变量可能会影响应用程序的其他部分。

答案 1 :(得分:5)

  • STDOUT是一个全局常量,因此不应更改。
  • $stdout是预定义的变量,因此可以更改。

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

$ ruby test.rb > test.log

然后在执行脚本之前确定您使用哪一个作为脚本的文件描述符并不重要。

但是,如果您尝试从Ruby脚本中更改OS的STDOUT的文件描述符,例如根据当前的当天将输出发送到一组旋转的日志文件,那么您将需要确保使用$stdout

答案 2 :(得分:4)

$stdoutSTDOUT都有不同的含义。 Ruby's documentation对此主题非常明确:

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

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

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

此外,还有一个预定义变量:

  
      
  • $> - print的默认输出printf,默认为$stdout
  •   

然而,在Ruby 2.3中,它只是表现为$stdout的别名。重新分配$stdout会更改$>的值,反之亦然。