Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

ファイルからの入力と標準入力

Rubyで、ファイルからの入力と標準入力について、ちょっとした疑問点が出てきました。
以下のような、サンプル(hoge.rb)において、

# ファイルからの読み込み
open(ARGV[0]) do |f|
  puts f.read
end
# 標準入力
print "Input> "
str = gets
puts str

実行すると、

mmasa@debian:~/work/ruby$ ruby -Ke hoge.rb foo.txt
from foo.txt
Input> from foo.txt

のように表示されます。
foo.txtの中身は、「from foo.txt」と書かれているだけです。
foo.txtの中身が表示されたあと、「Input> 」と表示され、キーボードからの入力待ちになると思ったのですが…。

#str = gets
str = STDIN.gets

とすると、自分の意図した動作になります。

mmasa@debian:~/work/ruby$ ruby -Ke hoge.rb foo.txt
from foo.txt
Input> from keyboard
from keyboard

なんでなんだろう?

追記

RubyリファレンスマニュアルのARGFを見ていたら、

gets など一部の組み込み関数は ARGF.gets などこのオブジェクトをレシーバとしたメソッドの省略形です。

とありました。納得しました。