class ARGF

ARGF 和 ARGV

ARGF 对象使用全局变量 ARGV 中的数组,使得 $stdin 和文件流在 Ruby 程序中可用。

读取

ARGF 可以从流读取,这些流在任何特定时间都由 ARGV 的内容确定。

最简单的情况

当使用空的 ARGV ([]) 发生第一次 ARGF 读取时,源是 $stdin

关于示例

这里的许多示例都假设存在文件 foo.txtbar.txt

$ cat foo.txt
Foo 0
Foo 1
$ cat bar.txt
Bar 0
Bar 1
Bar 2
Bar 3

ARGV 中的源

对于任何 ARGF 读取,除了 最简单的情况(即,除了使用空的 ARGV 进行的第一次 ARGF 读取),源都在 ARGV 中找到。

ARGF 假设数组 ARGV 中的每个元素都是一个潜在的源,并且是以下之一

在 ARGF 访问该源之前,应该从 ARGV 中删除不是这些之一的每个元素。

在以下示例中

示例

ARGF 的流访问从左到右考虑 ARGV 的元素

由于 ARGV 的值是一个普通数组,您可以对其进行操作以控制 ARGF 考虑哪些源

当访问其对应的源时,ARGV 中的每个元素都会被删除;当所有源都被访问完时,该数组为空

ARGV 中的文件路径

ARGV 数组可以包含指定 ARGF 读取源的文件路径。

此程序打印从命令行指定路径的文件中读取的内容

ARGV 中指定 $stdin

要在 ARGV 中指定流 $stdin,请使用字符 '-'

当没有给出字符 '-' 时,流 $stdin 将被忽略(例外:请参见 在 ARGV 中指定 $stdin

ARGV 中的混合和重复

对于 ARGF 读取器,ARGV 可以包含文件路径和字符 '-' 的任何混合,包括重复。

ARGV 的修改

正在运行的 Ruby 程序可以对 ARGV 数组进行任何修改;ARGV 的当前值会影响 ARGF 读取。

空的 ARGV

对于空的 ARGV,ARGF 读取方法要么返回 nil,要么引发异常,具体取决于特定的方法。

更多读取方法

如上所示,方法 ARGF#read 将所有源的内容读取到单个字符串中。其他 ARGF 方法提供了其他访问该内容的方式;这些方法包括:

关于 Enumerable

ARGF 包含模块 Enumerable。Enumerable 中的几乎所有方法都会调用包含类中的方法 each

请注意:在 ARGF 中,方法 each 返回来自的数据,而不是来自 ARGV 的数据;因此,例如,ARGF#entries 返回来自源的行数组,而不是来自 ARGV 的字符串数组

写入

如果原地模式生效,ARGF 可以写入目标流,这些流在任何特定时间由 ARGV 的内容确定。

关于原地模式的方法

用于写入的方法