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