Ruby有两种引用标准输入的方式:STDIN
常量和$stdin
全局变量.
除了我可以给$stdin
分配一个不同的IO
对象,因为它不是一个常数(例如,在我的子元素们Forking 重定向IO之前),STDIN
和$stdin
之间有什么区别?我应该什么时候在代码中使用它们?
如果我重新分配$stdin
,会影响STDIN
吗?
这是否也适用于STDOUT
/$stdout
和STDER
/$stderr
?
Ruby有两种引用标准输入的方式:STDIN
常量和$stdin
全局变量.
除了我可以给$stdin
分配一个不同的IO
对象,因为它不是一个常数(例如,在我的子元素们Forking 重定向IO之前),STDIN
和$stdin
之间有什么区别?我应该什么时候在代码中使用它们?
如果我重新分配$stdin
,会影响STDIN
吗?
这是否也适用于STDOUT
/$stdout
和STDER
/$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
行为.