我想知道STDIN
和$stdin
之间是否存在任何真正的区别。我在irb:
STDIN == $stdin
然后返回true
。它们只是两个同名的名字吗?或者有什么不同?
答案 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上,那么你不能做多少事情。操作系统级文件(例如,您可以将它们更改为您可以在程序中的其他位置读取的管道。)