Книга: Программирование на языке Ruby
14.2.2. Константа ARGF
14.2.2. Константа ARGF
Глобальная константа ARGF
представляет псевдофайл, получающийся в результате конкатенации всех имен файлов, заданных в командной строке. Во многих отношениях она ведет себя так же, как объект IO
.
Когда в программе встречается «голый» метод ввода (без указания вызывающего объекта), обычно имеется в виду метод, подмешанный из модуля Kernel
(например, gets
и readlines
). Если в командной строке не задано ни одного файла, то по умолчанию источником ввода является объект stdin
. Но если файлы заданы, то данные читаются из них. Понятно, что конец файла достигается в конце последнего из указанных файлов.
Если хотите, можете обращаться к ARGF
явно:
# Скопировать все файлы на stdout.
puts ARGF.readlines
Быть может, вопреки ожиданиям, признак конца файла устанавливается после каждого файла. Так, предыдущий код выведет все файлы, а следующий — только первый файл:
until ARGF.eof?
puts ARGF.gets
end
Является ли это ошибкой, предоставим судить вам. Впрочем, сюрпризы могут быть и приятными. Входные данные — не просто поток байтов; мы можем применять к ARGF
операции seek
и rewind
, как если бы это был «настоящий файл».
С константой ARGF
ассоциирован метод file
— он возвращает объект IO
, соответствующий файлу, обрабатываемому в данный момент. Естественно, возвращаемое значение изменяется по мере перехода от одного файла к другому.
А если мы не хотим интерпретировать имена аргументов в командной строке как имена файлов? Тогда не надо обращаться к методам ввода без указания вызывающего объекта. Если вы хотите читать из стандартного ввода, укажите в качестве такого объекта STDIN
, и все будет работать правильно.