代码之家  ›  专栏  ›  技术社区  ›  Ken Bloom

Ruby中STDIN和$STDIN的区别是什么?

  •  36
  • Ken Bloom  · 技术社区  · 14 年前

    Ruby有两种引用标准输入的方法: STDIN 常数,和 $stdin 全局变量。

    除了事实上我可以分配一个不同的 IO 反对 $标准 因为它不是一个常数(例如,在分叉重定向我的孩子中的IO之前),两者之间的区别是什么 标准物质 $标准 ? 我应该什么时候在代码中使用每一个?

    如果我重新分配 $标准 ,是否影响 标准物质 ?

    这也适用于 STDOUT / $stdout STDER / $stderr ?

    2 回复  |  直到 14 年前
        1
  •  40
  •   sepp2k    14 年前

    如果 $stdin 被重新分配, STDIN 不受影响。同样地 $标准 在以下情况下不受影响 标准物质 被重新分配(这是完全可能的(虽然毫无意义),但会产生警告)。但是,如果两个变量都没有被重新分配,它们都指向同一个IO对象,因此调用 reopen 一个会影响另一个。

    所有内置的ruby方法都使用 $< (又名。 ARGF )读取输入。如果 ARGV 是空的, ARGF参数 从中读取 $标准 ,所以如果你重新分配 $标准 ,这将影响所有内置方法。如果你重新分配 标准物质 除非某些第三方方法使用 标准物质 .

    在你自己的代码中你应该使用 $标准 与内置方法保持一致。

    ¹ 重新打开 是一种可以将IO对象重定向到另一个流或文件的方法。但是,您不能使用它将IO重定向到StringIO,因此它不会消除重新分配的所有用例 $标准 .

    当然你也可以用 $< / ARGF参数 与内置方法更加一致,但大多数情况下 不要 想要 ARGF参数 如果显式使用stdin流,则为行为。

        2
  •  1
  •   mtelis    14 年前

    STDERR和$STDERR最初指向的是同一个东西;您可以重新分配全局变量,但不应该弄乱常量。$stdin和stdin,$stdout和stdout对也是。

    我不得不更改STDERR几次,作为一种替代方法,用STDERR.puts修补一些输出错误消息的gems。如果使用STDERR=$stdout重新分配,则在STDERR.reopen('nul','w')运行时会收到警告。