ふと気がついたのですが、FileUtils.copy_stream は ARGF を受け付けないようです。
% ruby -rfileutils -e 'FileUtils.copy_stream(ARGF, STDOUT)' /dev/null
/home/akr/ruby/lib/ruby/1.9/fileutils.rb:446:in `fu_copy_stream0': undefined method `sysread' for ARGF:Object (NoMethodError)
from /home/akr/ruby/lib/ruby/1.9/fileutils.rb:440:in `copy_stream'
from -e:1
ドキュメントには
#
# Copies stream +src+ to +dest+.
# Both of +src+ and +dest+ must be a IO.
#
とあり、ARGF は IO ではないのでそれはそういうものなのかもしれませんが、
意外に思いました。
duck type な考え方でいえば、ARGF が sysread を持っていないのだからしか
たがないという見方もあるのですが、read を持っていれば受け付けてくれて
もいいんじゃないだろうかと感じたのですが、どうでしょう?
なお、ARGF が sysread を持つべきだという見方も考えられるのですが、
sysread は system call 直結というイメージがあって、ARGF につけるのは
ちょっと変なように感じます。
--
[田中 哲][たなか あきら][Tanaka Akira]