所以我试图暂时将输出重定向到文件:
prev_std = STDOUT
$stdout.reopen(@filename, 'w:UTF-8')
# stuff happens here with @filename and lots of output
$stdout = prev_std
但是当我这样做时,我似乎无法在之后将其重定向。我在这里做错了什么?
答案 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