【问题标题】:Ruby: What's the difference between IO and ARGV?Ruby:IO 和 ARGV 有什么区别?
【发布时间】:2014-07-26 05:43:29
【问题描述】:

我一直在尝试理解两者之间的区别,但到目前为止我的理解非常初级。我相信 ARGV 是 IO 的一个子集。我知道 ARGV 在调用 Ruby 脚本时会返回一个数组,但 IO 也会做同样的事情。谁能向我解释这个话题或指导我做出一个好的解释?我搜索了多个博客,但无济于事。 谢谢!

【问题讨论】:

    标签: ruby io argv


    【解决方案1】:

    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 的子类(例如TCPSocketUDPSocket)。

    IO 是 Ruby 中类似文件的东西的基类。

    也许你想的是ARGF而不是ARGV

    ARGF 是一个流设计用于处理作为命令行参数或通过 STDIN 传入的文件的脚本。

    传递给脚本的参数存储在ARGV 数组中,每个元素一个参数。 ARGF 假定所有不是文件名的参数都已从 ARGV 中删除。

    [...]

    如果ARGV 为空,ARGF 的行为就好像它包含STDIN,即通过管道传输到您的脚本的数据。

    所以你可以像 IO 一样使用ARGF,让你说:

    $ your_script some_file
    

    $ some_command | your_script
    

    没有your_script 真的需要关心它的调用方式。

    【讨论】:

    • @Зелёный 因为它们是类似文件的东西
    • 谢谢!我现在有了更好的理解。
    【解决方案2】:

    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 数组,其中包含参数 传递给您的脚本,每个元素一个。

    来源:http://www.ruby-doc.org/core-2.1.2/ARGF.html

    【讨论】:

    • 我明白了...感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2021-11-09
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    相关资源
    最近更新 更多