Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby stdio consts和globals有什么用途?_Ruby_Unix_Stdout_Stdin_Stdio - Fatal编程技术网

Ruby stdio consts和globals有什么用途?

Ruby stdio consts和globals有什么用途?,ruby,unix,stdout,stdin,stdio,Ruby,Unix,Stdout,Stdin,Stdio,Ruby为stdio提供了常量和全局变量 即,常量STDIN,STDOUT,STDERR,以及它们的变量对应项,$STDIN,$STDOUT,$STDERR 我理解常数和变量之间的区别。我知道在执行脚本时,常量是不可变地设置为文件描述符的 我也知道,您可以在运行时更改(某些)变量 我对这种功能的实际用途很好奇。你为什么要这么做?你能做到什么 看到一些从现实世界项目中提取的示例代码,甚至只是用例都会很棒 更新:从我目前收集的信息来看,在编写自己的库/程序时,您应该更喜欢使用变量而不是常量,这样用

Ruby为stdio提供了常量和全局变量

即,常量
STDIN
STDOUT
STDERR
,以及它们的变量对应项,
$STDIN
$STDOUT
$STDERR

我理解常数和变量之间的区别。我知道在执行脚本时,常量是不可变地设置为文件描述符的

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

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

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



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

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

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

在我看来,这个想法似乎只是简单地允许一个简单的解决方案来解决一个可能执行得很差的程序

$stderr = File.open 'error.log', 'w'

所有错误都将写入错误。log

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

#!/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
put
写入控制台的内容

$
变量允许您为Ruby提供不同的IO对象,用于stdout、stdin、stderr:

$stdout = buffer
常量使
$
变量很容易恢复到原始值(程序启动时):


您不了解写入文件的哪一部分?请参阅我在何处编写的“此类功能的实际用途”?将信息注销到文件非常实用,并且在执行重定向之前不必自己跟踪原始文件描述符非常方便。如果你看不到任何价值,那么你自己一定在写一些非常琐碎的东西。s/可能是执行得很差的程序/应该扔掉unix脚本/请注意,
打印
放置
实际写入
$>
,它最初设置为
$stdout
,但可以更改。至少我是这么想的。啊,幽默。总是很搞笑。我同意扔掉的部分。毕竟,Ruby是一种很棒的脚本语言。有道理,如果你有一个确定你应该登录到一个文件而不是stderr的配置文件。你为什么不将缓冲区初始化为StringIO呢?当我在一百万年前编写这个函数时,我是个新手,不知道StringIO。见鬼,当时是Ruby 1.6。从那以后,今天是我第一次不得不看这段代码。但是代码是否使用StringIO是一个外围问题。事实上,这是一个外围问题,StringIO的代码更少,这有助于提高示例相关部分的可读性。我会接受你的回答。我将使用stringio对其进行编辑,如果您不喜欢我所做的更改,请随时将其还原。如果可能的话,是否有人可以将原始版本也放入其中,以便我可以学习如何通过使用stringio极大地改进我的新手Ruby代码?:)@布兰登,你有没有在评论列表的上方贴上“几分钟前编辑过”的链接?点击它会显示答案的每个版本。只需向下滚动到最旧的一个。
$stdout = STDOUT