我似乎无法让文件输出正常工作:
record = File.open("/tmp/record", "w")
old_stdout = $stdout
$stdout = record
$stderr = $stdout
puts "This is a record"
z = 10/0
当我从命令行运行或撬动它时,我似乎无法将输出输出到文件中。任何想法为什么这不起作用?
一个可能的问题是您没有关闭文件流。
这样做很重要,因为文件缓冲区可能尚未刷新到文件本身。因为您的代码使用零除法生成错误,Ruby 也可能没有正确关闭文件。
也就是说,您的代码可以写得更干净,更像 Ruby,而不会破坏如何puts
用于写入文件:
File.open("/tmp/record", "w") do |record|
record.puts "This is a record"
end
当块退出时,这将自动关闭文件输出。
也许您正试图捕获您正在使用生成的自诱导零除异常的输出z = 10/0
?
您可以通过抢救异常来做到这一点;没有它,你无法让 Ruby 继续运行:
File.open("./record", "w") do |record|
record.puts "This is a record"
begin
z = 10/0
rescue Exception => e
record.puts e.message
end
end
运行后,“记录”包含:
This is a record
divided by 0
或者,您可以这样做:
File.open("./record", "w") do |record|
old_stdout, old_stderr = $stdout, $old_stderr
$stdout = $stderr = record
puts "This is a record"
begin
z = 10/0
rescue Exception => e
puts e.message
end
$stdout, $stderr = old_stdout, old_stderr
end
其中,运行后,“记录”再次包含:
This is a record
divided by 0
有时我们想通过重新分配 STDOUT 和 STDERR 来玩游戏,但总的来说,我建议不要这样做。相反,使用以下内容直接写信给他们:
$sterr.puts "foo blowed up"
这是为了使正在发生的事情更加明显,以提高可读性和可维护性。如果您已将 $stderr 重定向到一个文件,当时是凌晨 3:00,并且您正试图记住代码的作用,因为您的系统已关闭,并且您没有像预期的那样看到输出,您可能很想将代码重写为上述代码,或者破解一些强制输出您期望的东西。混乱可以从那里级联。