首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ruby中,STDIN和$stdin有什么不同?

在Ruby中,STDIN和$stdin有什么不同?
EN

Stack Overflow用户
提问于 2010-11-26 01:32:00
回答 2查看 11K关注 0票数 41

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-26 01:46:08

如果重新分配$stdinSTDIN不会受到影响。同样,当STDIN被重新分配时,$stdin也不会受到影响(这是完全可能的(虽然没有意义),但会产生一个警告)。但是,如果这两个变量都没有重新赋值,则它们都指向相同的IO对象,因此在一个变量上调用reopen?会影响另一个变量。

所有内置的ruby方法都使用$< (也称为.ARGF)来读取输入。如果ARGV为空,ARGF将从$stdin读取数据,因此如果重新分配$stdin,将影响所有内置方法。除非某些第三方方法使用STDIN,否则重新分配STDIN将不起作用。

在你自己的代码中,你应该使用$stdin来与内置的方法²保持一致。

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

²当然,您也可以使用$</ARGF来与内置方法保持更一致,但是大多数时候,如果您显式地使用标准输入流,您就不希望使用ARGF行为。

票数 43
EN

Stack Overflow用户

发布于 2010-11-26 01:41:32

STDERR和$stderr最初指向的是同一件事;您可以重新分配全局变量,但不应该弄乱常量。$stdin和STDIN、$stdout和STDOUT对也是一样的。

我不得不修改标准错误码几次,而不是用STDERR.puts修补一些输出错误消息的gem。如果你用STDERR = $stdout重新赋值,你会得到一个警告,而STDERR.reopen('nul','w')是不言而喻的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4279604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档