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

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

如果我重新分配$stdin,是否会影响STDIN

这也适用于STDOUT / $stdoutSTDER / $stderr吗?

最佳答案

如果重新分配了$stdin,则不影响STDIN。同样,重新分配$stdinSTDIN也不受影响(这是完全可能的(虽然毫无意义),但会产生警告)。但是,如果两个变量都没有被重新分配,则它们都指向同一个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/

10-15 14:37