Ruby有两种引用标准输入的方法:STDIN常量和$stdin全局变量.
除了我可以分配一个不同的IO对象,$stdin因为它不是一个常量(例如在我的孩子中重新定向IO之前),STDIN和之间的区别是$stdin什么?我什么时候应该在我的代码中使用每个?
如果我重新分配$stdin,它会影响STDIN吗?
这也适用于STDOUT/ $stdout和STDER/ $stderr?
sep*_*p2k 40
如果$stdin被重新分配,STDIN则不受影响.同样$stdin在STDIN重新分配时不受影响(这是完全可能的(尽管毫无意义),但会产生警告).但是,如果两个变量都没有被重新分配,它们都指向同一个IO对象,因此reopen在一个上调用¹会影响另一个.
所有内置的ruby方法都使用$<(aka ARGF)来读取输入.如果ARGV为空,则ARGF从中读取$stdin,因此如果重新分配$stdin,则会影响所有内置方法.如果重新分配STDIN,除非某些第三方方法使用,否则它将无效STDIN.
在您自己的代码中,您应该使用$stdin与内置方法2一致.
¹ reopen是一种可以将IO对象重定向到另一个流或文件的方法.但是,您无法使用它将IO重定向到StringIO,因此它不会消除重新分配的所有用例$stdin.
²当然也可以使用$</ ARGF与内置方法更加一致,但是如果你明确使用stdin流,大多数时候你不想要这种ARGF行为.