Ruby有两种引用标准输入的方式:STDIN常量和$stdin全局变量.

除了我可以给$stdin分配一个不同的IO对象,因为它不是一个常数(例如,在我的子元素们Forking 重定向IO之前),STDIN$stdin之间有什么区别?我应该什么时候在代码中使用它们?

如果我重新分配$stdin,会影响STDIN吗?

这是否也适用于STDOUT/$stdoutSTDER/$stderr

推荐答案

如果$stdin被重新分配,STDIN不受影响.同样,当STDIN被重新分配时,$stdin不会受到影响(这是完全可能的(尽管毫无意义),但会产生警告).但是,如果两个变量都没有被重新分配,它们都指向同一个IO对象,因此对其中一个调用reopenª将影响另一个.

所有内置的ruby方法都使用$<(也称ARGF)来读取输入.如果ARGV为空,则ARGF$stdin读取,因此如果重新分配$stdin,将影响所有内置方法.如果你重新分配STDIN,它将没有任何效果,除非某些第三方方法使用STDIN.

在自己的代码中,应该使用$stdin来与内置方法保持一致.

1 reopen是一种可以将IO对象重定向到另一个流或文件的方法.但是,您不能使用它将IO重定向到StringIO,因此它不能消除所有重新分配$stdin的情况.

²当然,您也可以使用$</ARGF来与内置方法更加一致,但大多数情况下,如果您显式使用stdin流,您需要ARGF行为.

Ruby相关问答推荐

为什么 ruby​​ 获得证书信任链与 gnutls-cli 不同

如何使用正则表达式在字符串中查找特定匹配项

.nil?、.blank? 之间的区别?和.empty?

我可以在 Ruby 的 heredoc 中访问变量吗?

Rspec: expectvsexpect什么区别?

如何使用 RSpec 忽略或跳过测试方法?

将ruby数组转换为连续对数组

判断文件是否包含字符串

为什么 Matz Select 在 Ruby 中默认使字符串可变?

Ruby 中 Postgres 查询的简单示例

如何判断我是从 JRuby 还是 Ruby 运行?

ruby命令在我的 Mac 上没有任何作用

如何让 Ruby 解析时间,就好像它在不同的时区一样?

为什么整数除法在许多脚本语言中舍入?

需要必要的库和/或头文件时如何安装 ruby​​-debug

在 ruby​​ 中将每个数组元素添加到文件的行中

Ruby NOT Rails 中有复数函数吗?

如何在 Mac OS Sierra 10.12 上安装 Nokogiri

如何在文件夹及其所有子文件夹中搜索特定类型的文件

将浮点数舍入到Ruby中最接近的整数