`STDIN`和`$ stdin`

时间:2015-04-22 12:35:31

标签: ruby

我想知道STDIN$stdin之间是否存在任何真正的区别。我在irb:

STDIN == $stdin

然后返回true。它们只是两个同名的名字吗?或者有什么不同?

2 个答案:

答案 0 :(得分:4)

来自Ruby globals

  

STDIN

     

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

默认情况下它们是同一个对象。

[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是一个常量。

答案 1 :(得分:3)

STDIN是常量,因此如果您尝试替换它,您将收到红宝石警告。否则这两个只是普通的ruby变量,因为它们可以指向同一个对象(并且默认情况下),如果它们这样做,用一个做某事会影响另一个变量,但是如果你给其中一个变量分配了其他东西,他们会有所不同。

默认情况下,get等标准ruby方法将从$stdin(非STDIN)读取。这意味着您可以覆盖标准方法的$stdin$stdout$stderr),并使用常量版本查看$stdin$stdout或{{1}原来是。

请注意,覆盖$stderr$stdin$stdout不会影响新生成的程序的标准流(分别是实际的文件描述符0,1和2)。为此,您需要在要更改的流上调用$stderr,例如(假设常量版本未被强制替换),

IO#reopen

现在重新打开,你可以只将流替换为实际的操作系统级文件/文件描述符(例如,没有STDOUT.reopen("newfile") #Write all output to "newfile" including the output of newly spawned processes (`%x{}`,`system`, `spawn`, `IO.popen`, etc.) ),但是如果你在UNIX上,那么你不能做多少事情。操作系统级文件(例如,您可以将它们更改为您可以在程序中的其他位置读取的管道。)