Ruby有两种引用标准输入的方式:STDIN
常量和$stdin
全局变量。
除了我可以为IO
分配一个不同的$stdin
对象(因为它不是常量)之外(例如,在 fork 重定向我的 child 中的IO之前),STDIN
和$stdin
有什么区别?什么时候应该在代码中使用它们?
如果我重新分配$stdin
,是否会影响STDIN
?
这也适用于STDOUT
/ $stdout
和STDER
/ $stderr
吗?
最佳答案
如果重新分配了$stdin
,则不影响STDIN
。同样,重新分配$stdin
时STDIN
也不受影响(这是完全可能的(虽然毫无意义),但会产生警告)。但是,如果两个变量都没有被重新分配,则它们都指向同一个IO对象,因此,对一个调用reopen
¹将影响另一个。
所有内置的ruby方法都使用$<
(也称为ARGF
)来读取输入。如果ARGV
为空,则ARGF
从$stdin
读取,因此,如果您重新分配$stdin
,则将影响所有内置方法。如果您重新分配STDIN
,则该方法将无效,除非某些第三方方法使用STDIN
。
在您自己的代码中,您应该使用$stdin
与内置方法²保持一致。reopen
是一种可以将IO对象重定向到另一个流或文件的方法。但是,您不能使用它将IO重定向到StringIO,因此不能消除重新分配$stdin
的所有用例。
²当然,您也可以使用$<
/ ARGF
与内置方法更加一致,但是大多数情况下,如果您明确使用stdin流,则不希望ARGF
行为。
关于ruby - Ruby中的STDIN和$ stdin有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4279604/