3

Ruby 有 stdio 的常量和全局变量。

即, consts STDIN, STDOUT, STDERR, 和它们的对应变量$stdin, $stdout, $stderr.

我理解常量和变量之间的区别。我知道在脚本被执行的那一刻,常量被不变地设置为文件描述符。

我也知道您可以在运行时更改(某些)变量。

我很好奇这种功能的实际用途。你为什么要这样做?你能实现什么?

看到从现实世界项目中提取的一些示例代码,甚至只是用例,会很棒。


更新:从我目前收集的信息来看,似乎在编写自己的库/程序时,您应该更喜欢使用变量而不是常量,以便其用户可以进一步使用它。对?

4

4 回答 4

3

生产代码中使用了此函数的更详细版本:

#!/usr/bin/env ruby -rstringio

def capture_stdout
  $stdout = StringIO.new
  begin
    yield
    $stdout.string
  ensure
    $stdout = STDOUT
  end
end

output = capture_stdout do
  print "Line"
  puts " 1"
end

p output     # => "Line 1\n"

它用于单元测试,想知道使用print或写入控制台的内容puts

这些$变量让您可以为 Ruby 提供标准输出、标准输入、标准错误的不同 IO 对象:

$stdout = buffer

常量可以很容易地将$变量恢复到它们的原始值(当你的程序启动时):

$stdout = STDOUT
于 2010-01-01T20:03:24.180 回答
2

松本关于它的书似乎给出了答案。引用 9.7.1.4预定义流:“默认情况下,全局函数喜欢printputs写入 $stdout。如果脚本更改此全局变量的值,它将更改这些方法的行为。”

在我看来,这个想法似乎只是简单地为可能实施不佳的程序提供简单的解决方案。

于 2010-01-01T19:45:24.610 回答
1
$stderr = File.open 'error.log', 'w'

所有错误都会写入error.log

于 2010-01-01T19:48:47.907 回答
0

您可以将部分输出发送到文件,然后在完成后将其转储回控制台。

于 2010-01-01T19:30:24.077 回答