ruby - Ruby 中的 STDIN 和 $stdin 有什么区别?

标签 ruby stdin

Ruby 有两种引用标准输入的方法:STDIN 常量和$stdin 全局变量。

除了我可以将不同的 IO 对象分配给 $stdin 因为它不是常量(例如,在我的 child 中 fork 重定向 IO 之前)之外,还有什么STDIN$stdin 的区别?我什么时候应该在我的代码中使用它们?

如果我重新分配 $stdin,它会影响 STDIN 吗?

这是否也适用于 STDOUT/$stdoutSTDER/$stderr

最佳答案

如果$stdin重新分配,STDIN不受影响。同样$stdin STDIN 时不受影响被重新分配(这是完全可能的(尽管毫无意义),但会产生警告)。然而,如果两个变量都没有被重新分配,它们都指向同一个 IO 对象,所以调用 reopen ¹ 一个会影响另一个。

所有内置的 ruby​​ 方法都使用 $< (又名 ARGF )读取输入。如果ARGV是空的,ARGF$stdin 读取, 所以如果你重新分配 $stdin ,这将影响所有内置方法。如果重新分配 STDIN除非某些第 3 方方法使用 STDIN,否则它将无效.

在您自己的代码中,您应该使用 $stdin与内置方法²保持一致。

¹ reopen是一种可以将 IO 对象重定向到另一个流或文件的方法。但是,您不能使用它将 IO 重定向到 StringIO,因此它不会消除重新分配 $stdin 的所有用例。 .

² 您当然也可以使用 $</ARGF与内置方法更加一致,但大多数时候您想要ARGF明确使用标准输入流时的行为。

关于ruby - Ruby 中的 STDIN 和 $stdin 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279604/

相关文章:

ruby - 从字符串中可靠地删除 unicode 的最佳方法是什么

arrays - 从排序数组中选择项目<值的有效方法

ruby-on-rails - 浏览器关闭时销毁 session - Ruby on Rails

ffmpeg - 管道管道线到 ffmpeg 标准输入

ruby - 如何在 Windows 上编译 Ruby?

bash - 是否可以将 STDIN 分布到并行进程中?

c - 结合使用 fgets 和 strtok 将输入转换为标记

c - 逐行读取文本文件中的字符串并将其存储在链表中

docker - 在 Windows 上将标准输入通过管道传输到 docker exec

ruby-on-rails - 用散列对数组求和