【问题标题】:Ruby stdio consts and globals, what are the uses?Ruby stdio consts 和 globals,有什么用?
【发布时间】:2010-01-01 19:27:28
【问题描述】:

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

即常量STDINSTDOUTSTDERR,以及它们的对应变量$stdin$stdout$stderr

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

我也了解您可以在运行时更改(部分)变量。

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

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


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

【问题讨论】:

    标签: ruby unix stdout stdin stdio


    【解决方案1】:

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

    #!/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"
    

    它用于想要知道使用printputs 写入控制台的内容的单元测试中。

    $ 变量让您可以为 Ruby 提供用于 stdout、stdin、stderr 的不同 IO 对象:

    $stdout = buffer
    

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

    $stdout = STDOUT
    

    【讨论】:

    • 为什么不将缓冲区初始化为 StringIO 呢?
    • 当我在数亿年前编写这个函数时,我还是个新手,并不了解 StringIO。哎呀,那时是 Ruby 1.6。从那时起,今天是我第一次不得不查看该代码。但是代码是否使用 StringIO 是一个外围问题。
    • 确实这是一个外围问题,而且 stringio 的代码更少,它有助于示例相关部分的可读性。我会接受你的回答。我将对其进行编辑以使用 stringio,如果您不喜欢我的更改,请随时恢复它。
    • 如果可能的话,有人能把原件也放上吗,这样我就可以学习如何使用 StringIO 大大改进我的新手 Ruby 代码? :)
    • @Brandon,你有没有在这个 cmets 列表上方标有“已编辑 分钟”的链接?单击它会显示答案的每个版本。只需向下滚动到最旧的。
    【解决方案2】:

    松本关于它的书似乎给出了答案。引用 9.7.1.4 预定义流:“像printputs 这样的全局函数默认写入$stdout。如果脚本改变了这个全局变量的值,它将改变那些方法。”

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

    【讨论】:

    • s/可能执行不佳的程序/据说是丢弃的 unix 脚本/
    • 请注意,printputs 实际上是写入 $>,最初设置为 $stdout,但可以更改。或者我认为。
    • 啊,sed 幽默。总是很搞笑。
    • 我同意丢弃部分。毕竟,Ruby 是一种很棒的脚本语言。
    【解决方案3】:
    $stderr = File.open 'error.log', 'w'
    

    所有错误都会写入error.log

    【讨论】:

    • 哼。这是有道理的,如果您有一个配置文件确定您应该登录到文件而不是标准错误。
    【解决方案4】:

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

    【讨论】:

    • 写入文件的哪一部分你不明白?
    • 看看我在哪里写的“这种功能的实际用途”?
    • 将信息记录到文件中非常实用,并且在执行重定向之前不必自己跟踪原始文件描述符非常方便。如果你在那里看不到任何价值,那么你一定是在自己写一些极其微不足道的东西。
    猜你喜欢
    • 2011-12-19
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2010-09-06
    • 2010-11-17
    • 2010-11-12
    • 2011-04-12
    相关资源
    最近更新 更多