Ruby中的STDIN和$ stdin有什么区别?

Ken*_*oom 37 ruby stdin

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

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

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

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

sep*_*p2k 40

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

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

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

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

²当然也可以使用$</ ARGF与内置方法更加一致,但是如果你明确使用stdin流,大多数时候你想要这种ARGF行为.

  • @Jörg:你是对的,他们使用`$ <`和`$>`,我会纠正的.但是你的第二点是不对的:`$>`和`$ stdout`是别名,所以重新分配一个会影响另一个(不像STDOUT不受影响).`$ <`与`ARGF`相同,*都不能被重新分配.然而,重新分配`$ stdin`*会影响`$ <`和`ARGF`,因为如果`ARGV`为空,`ARGF`从'$ stdin`读取. (4认同)