Ruby中$ stdout和STDOUT之间的区别


88

在Ruby中,$stdout(前面带有一个美元符号)和STDOUT(所有大写字母)之间有什么区别?执行输出重定向时,应使用哪个?为什么?这同样适用于$stderrSTDERR

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



@theTinMan有点重复。但是,必须注意的是,虽然$stdoutand STDOUT$stdinand 之间的差异STDIN是对称的,但$stdoutand $>$stdinand 之间的差异$<却不是。
skalee

Answers:


105

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

随着STDOUT是恒定的,你不应该重新定义它,但是,你可以重新定义$stdout没有错误/警告(重新定义STDOUT将引发警告)。例如,您可以执行以下操作:

$stdout = STDERR

这同样适用于$stderrSTDERR


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


3
实际上,如果要重定向输出,则应使用$>,而不是缺省输出流$stdout
约尔格W¯¯米塔格

9
刚刚发现一对另一个问题的评论,说$stdout$>是别名,所以重新分配一个会影响到其他。
jrdioko

9
@jrdioko:你是对的。很显然,我不仅每天学习新的东西,我每天都:-)也忘了什么东西
约尔格W¯¯米塔格

2
阅读更多内容,听起来最好使用IO#reopen而不是简单的分配。
jrdioko

@jrdioko为什么你认为这是更好地使用IO#reopen中的情况下$stdout?我完全不同意这种观点。该$stdout.reopen方法会更改其接收者,并且STDOUT如果您$stdout之前没有重新分配它,也会影响它。它们并不意味着是同义词,当它们由于赋值而持有不同的值时,并通过重新打开STDOUT就打破了它的目的,这也不错。
skalee

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

如果您使用外壳进行重定向:

$ ruby test.rb > test.log

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

但是,如果您要尝试从Ruby脚本中更改操作系统的STDOUT的文件描述符,例如根据一周中的当前日期将输出发送到轮换的日志文件集,则需要确保你用$stdout


5
“ STDOUT是一个全局常数,因此它不会改变”。它是一个常数,可以更改,但是会发出警告。STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Tin Man

嗯,是的,所以应该说“所以不应该更改”。谢谢!
sharlrlxxv 2011年

5

两者$stdoutSTDOUT具有不同的含义。 Ruby的文档对此主题非常清楚:

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

要写入标准输出时,实际上是指当前的标准输出,因此应写入$stdout

STDOUT也不是没有用。它存储的默认值$stdout。如果您曾经进行过重新分配$stdout,则可以使用将其恢复到以前的值$stdout = STDOUT

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

  • $>–打印的默认输出printf,$stdout默认情况下为默认值。

但是,看起来在Ruby 2.3中,它只是充当的别名$stdout。重新分配会$stdout更改的值,$>反之亦然。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.