ARGF の機能

  • 引数にファイルが指定されていればそれらを順次処理
  • そうでない場合は標準入力から読み込む

UNIX のフィルタで一般的なこの動作を実現するのに、ARGF*1 を使う。

ARGF を使って cat もどきを書くとこうなる。

while line = ARGF.gets
  print line
end

またはこう。こっちの書き方の方が Ruby*2とのこと。

ARGF.each {|line| print line }

これで、ファイルが指定されていればそれらを順次出力し、なければ標準入力(端末)から読み 込んでエコーするという、cat コマンドとほぼ同等の動きをする。

マニュアルによると、これは意味的には大体以下と同じ*3らしい↓

while argv = ARGV.shift
  File.open(argv) { |file|
    while line = file.gets
      print line
    end
  }
end

ちなみに、Perl ではこんな感じ。

while (<>) {
    print;
}

多分、Perl のこの機能を意識してると思う。

*1:仮想ファイルオブジェクトとか呼ばれてる。

*2:ピッケル本第2版p20参照

*3:ファイルが指定されていなければ標準入力から読み込む、というのが抜けてるけど。