首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“stdin`”和“$stdin`”之间的差异

“stdin`”和“$stdin`”之间的差异
EN

Stack Overflow用户
提问于 2015-04-22 12:35:30
回答 2查看 298关注 0票数 3

我想知道STDIN$stdin之间是否真的有什么区别。我在irb做过:

代码语言:javascript
复制
STDIN == $stdin

然后回来,true。他们只是同一件事的两个名字吗?还是有什么不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-22 12:37:43

来自红宝石全局

STDIN 标准输入。$stdin的默认值。

默认情况下,它们是相同的对象。

代码语言:javascript
复制
[1] pry(main)> $stdin.object_id
=> 13338048
[2] pry(main)> STDIN.object_id
=> 13338048
[3] pry(main)> $stdin.object_id == STDIN.object_id
=> true

正如@shivam所评论的,$stdin是一个全局变量,它可能被分配给不同的东西,而STDIN是一个常量。

票数 4
EN

Stack Overflow用户

发布于 2015-04-22 13:22:39

STDIN是一个常量,因此,如果您试图替换它,您将得到一个红宝石警告。否则,这两个变量只是普通的ruby变量,因为它们可以指向相同的对象(默认情况下),如果它们这样做了,使用其中一个变量执行某些操作将影响另一个变量,但是如果将其他一些东西分配给其中一个变量,它们将是不同的。

默认情况下,像get这样的标准红宝石方法将从$stdin (而不是STDIN)读取。这意味着您可以为标准方法重写$stdin ($stdout$stderr),并使用常量版本来查看$stdin$stdout$stderr的起源。

请注意,重写$stdin$stdout$stderr不会影响新生成的程序的标准流(实际文件分别为0、1和2)。要做到这一点,您需要在您想要更改的流上调用IO#reopen,例如(假设常量版本没有强制替换),

代码语言:javascript
复制
STDOUT.reopen("newfile") #Write all output to "newfile" including the output of newly spawned processes (`%x{}`,`system`, `spawn`, `IO.popen`, etc.)

现在,通过重新打开,您只可以将流替换为实际的OS级文件/文件描述符(例如,没有StringIO),但是如果您在UNIX上,您可以对OS级别的文件做很多事情(例如,您可以将它们更改为程序中其他地方可以读取的管道)。

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

https://stackoverflow.com/questions/29797777

复制
相关文章

相似问题

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