【发布时间】:2014-07-26 05:43:29
【问题描述】:
我一直在尝试理解两者之间的区别,但到目前为止我的理解非常初级。我相信 ARGV 是 IO 的一个子集。我知道 ARGV 在调用 Ruby 脚本时会返回一个数组,但 IO 也会做同样的事情。谁能向我解释这个话题或指导我做出一个好的解释?我搜索了多个博客,但无济于事。 谢谢!
【问题讨论】:
我一直在尝试理解两者之间的区别,但到目前为止我的理解非常初级。我相信 ARGV 是 IO 的一个子集。我知道 ARGV 在调用 Ruby 脚本时会返回一个数组,但 IO 也会做同样的事情。谁能向我解释这个话题或指导我做出一个好的解释?我搜索了多个博客,但无济于事。 谢谢!
【问题讨论】:
ARGV 是一个数组:
> ARGV.class
=> Array
此数组包含脚本的命令行参数。例如:
$ cat pancakes.rb
puts ARGV.inspect
$ ruby pancakes.rb -where is house
["-where", "is", "house"]
IO 有点不同。 IO is:
[...] Ruby 中所有输入和输出的基础。 [...]
本节中的许多示例都使用
File类,这是IO的唯一标准子类。这两个类密切相关。与File类一样,Socket 库是IO的子类(例如TCPSocket或UDPSocket)。
IO 是 Ruby 中类似文件的东西的基类。
也许你想的是ARGF而不是ARGV:
ARGF是一个流设计用于处理作为命令行参数或通过 STDIN 传入的文件的脚本。传递给脚本的参数存储在
ARGV数组中,每个元素一个参数。ARGF假定所有不是文件名的参数都已从ARGV中删除。[...]
如果
ARGV为空,ARGF的行为就好像它包含STDIN,即通过管道传输到您的脚本的数据。
所以你可以像 IO 一样使用ARGF,让你说:
$ your_script some_file
和
$ some_command | your_script
没有your_script 真的需要关心它的调用方式。
【讨论】:
IO 类是 Ruby 中所有输入和输出的基础。一个 I/O 流可以是双工的(即双向),因此可以使用多个本机操作系统流。
本节中的许多示例都使用 File 类,这是唯一的 IO 的标准子类。这两个类密切相关。喜欢 File 类,来自 IO 的 Socket 库子类(例如 TCPSocket 或 UDPSocket)。
Kernel#open 方法可以为这些创建一个 IO(或文件)对象 参数类型:
纯字符串表示适合底层的文件名 操作系统。以“|”开头的字符串表示子进程。 “|”后面的字符串的剩余部分作为进程调用 与连接到它的适当的输入/输出通道。一个字符串等于 to "|-" 将创建另一个 Ruby 实例作为子进程。 IO 可以 以不同的文件模式打开(只读,只写)和 正确转换的编码。有关这些选项,请参见 ::new。看 Kernel#open 了解所描述的各种命令格式的详细信息 以上。
来源:http://www.ruby-doc.org/core-2.1.2/IO.html
ARGF 是一种流,设计用于处理作为命令行参数给出的文件的脚本或 通过 STDIN 传入。
传递给脚本的参数存储在 ARGV 数组中,一个 每个元素的参数。 ARGF 假设任何不是 文件名已从 ARGV 中删除。
argv → ARGV 返回 ARGV 数组,其中包含参数 传递给您的脚本,每个元素一个。
【讨论】: