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.)