Ruby “STDIN”和“$STDIN”之间的差异`
我想知道Ruby “STDIN”和“$STDIN”之间的差异`,ruby,Ruby,我想知道STDIN和$STDIN之间是否有真正的区别。我在irb工作: STDIN == $stdin 然后返回true。它们只是同一事物的两个名字吗?或者有什么不同?来自: 标准 标准输入。$stdin的默认值 默认情况下,它们是相同的对象 [1] pry(main)> $stdin.object_id => 13338048 [2] pry(main)> STDIN.object_id => 13338048 [3] pry(main)> $stdin.obj
STDIN
和$STDIN
之间是否有真正的区别。我在irb工作:
STDIN == $stdin
然后返回true
。它们只是同一事物的两个名字吗?或者有什么不同?来自:
标准
标准输入。$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
是一个常量。stdin是一个常量,因此如果您尝试替换它,您将得到一个ruby警告。否则,这两个变量只是普通的ruby变量,因为它们可以指向同一个对象(默认情况下是这样),如果它们指向同一个对象,则使用其中一个对象执行操作将影响另一个变量,但是如果将其他对象指定给其中一个变量,则它们将不同
默认情况下,get
等标准ruby方法将从$stdin
(非stdin)读取。这意味着您可以覆盖标准方法的$stdin
($stdout
,$stderr
)并使用常量版本查看$stdin
,$stdout
或$stderr
最初是什么
请注意,重写$stdin
、$stdout
或$stderr
不会影响新生成程序的标准流(分别是实际的文件描述符0、1和2)。要做到这一点,您需要在您想要更改的流上调用IO#重新打开
,例如(假设常量版本没有被强制替换)
现在使用reopen,您可以只将流替换为实际的操作系统级文件/文件描述符(例如,no
StringIO
),但如果您使用的是UNIX,则操作系统级文件没有什么不可以做的(例如,您可以将其更改为管道,以便在程序中的其他地方读取)。其可能的重复不是完全正确的$stdin=“asd”
,$stdin.object\u id==stdin.object\u id\u id==false
@shivam是的,我应该说“默认情况下”,所以,如果我执行$stdout=File.open(“test.log”,“w”),那么stdout允许我将输出重定向回控制台?这是主要原因还是有其他应用程序?@NikitaLuparev是的,它提供了一种重定向输入和输出的方法,默认情况下,put
,get
。
STDOUT.reopen("newfile") #Write all output to "newfile" including the output of newly spawned processes (`%x{}`,`system`, `spawn`, `IO.popen`, etc.)