Ruby有两种引用标准输入的方式:STDIN常量和$stdin全局变量。
除了我可以给$stdin分配一个不同的IO对象这一事实,因为它不是常量(例如,在我的子代中派生重定向IO之前),STDIN和$stdin之间有什么区别?我应该在什么时候在我的代码中使用每一个?
如果我重新分配$stdin,是否会影响STDIN
这是否也适用于STDOUT/$stdout和STDER/$stderr
发布于 2010-11-26 01:46:08
如果重新分配$stdin,STDIN不会受到影响。同样,当STDIN被重新分配时,$stdin也不会受到影响(这是完全可能的(虽然没有意义),但会产生一个警告)。但是,如果这两个变量都没有重新赋值,则它们都指向相同的IO对象,因此在一个变量上调用reopen?会影响另一个变量。
所有内置的ruby方法都使用$< (也称为.ARGF)来读取输入。如果ARGV为空,ARGF将从$stdin读取数据,因此如果重新分配$stdin,将影响所有内置方法。除非某些第三方方法使用STDIN,否则重新分配STDIN将不起作用。
在你自己的代码中,你应该使用$stdin来与内置的方法²保持一致。
«reopen是一种可以将IO对象重定向到另一个流或文件的方法。但是,您不能使用它将IO重定向到StringIO,因此它不会消除重新分配$stdin的所有用例。
²当然,您也可以使用$</ARGF来与内置方法保持更一致,但是大多数时候,如果您显式地使用标准输入流,您就不希望使用ARGF行为。
发布于 2010-11-26 01:41:32
STDERR和$stderr最初指向的是同一件事;您可以重新分配全局变量,但不应该弄乱常量。$stdin和STDIN、$stdout和STDOUT对也是一样的。
我不得不修改标准错误码几次,而不是用STDERR.puts修补一些输出错误消息的gem。如果你用STDERR = $stdout重新赋值,你会得到一个警告,而STDERR.reopen('nul','w')是不言而喻的。
https://stackoverflow.com/questions/4279604
复制相似问题