我想知道STDIN和$stdin之间是否真的有什么区别。我在irb做过:
STDIN == $stdin然后回来,true。他们只是同一件事的两个名字吗?还是有什么不同?
发布于 2015-04-22 12:37:43
来自红宝石全局
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是一个常量。
发布于 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,例如(假设常量版本没有强制替换),
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级别的文件做很多事情(例如,您可以将它们更改为程序中其他地方可以读取的管道)。
https://stackoverflow.com/questions/29797777
复制相似问题