在Ruby中输出重定向故障排除

时间:2015-04-08 18:16:27

标签: ruby stdout

所以我试图暂时将输出重定向到文件:

  prev_std = STDOUT

  $stdout.reopen(@filename, 'w:UTF-8')

  # stuff happens here with @filename and lots of output

  $stdout = prev_std

但是当我这样做时,我似乎无法在之后将其重定向。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

STDOUT是一个表示标准输出的常量,它是一个IO对象。 $stdout是一个全局变量,其默认值通常为STDOUT,默认情况下,它们都指向同一个对象:

$stdout.object_id == STDOUT.object_id => true

如果你在其中一个上调用方法,另一个会受到影响。因此,如果您使用$stdout调用某个方法,它也会在STDOUT上生效。在reopen上拨打$stdout也会影响STDOUT(即使它是常量)。

如果要暂时将输出重定向到文件并将其还原到标准输出,则应为$stdout分配一个新的IO对象:

$stdout = File.open('/path/to/file', 'w:UTF-8')
puts "this will go to the file"
$stdout = STDOUT
puts "this will go to standard output!"

另见以下问题:

答案 1 :(得分:0)

您在reopen上呼叫STDOUT,因为$stdout只是一个指向同一对象的全局变量。这将永久更改STDOUT

这个怎么样:

$stdout = File.open(@filename, 'w:UTF-8')

# ...

$stdout = prev_std