In article <5.1.1.8.2.20021118171227.0335c008 / blade.nagaokaut.ac.jp>,
  Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp> writes:

> ところで、やっぱりちょっと引っかかるのは、読み終えたファイルハンドルに
> 対する gets と、ファイルハンドルの close です。そのあたり、Ruby がうま
> くやってくれるので、このケースでは考えなくてもいいんですが、思考実験と
> して、もうちょっと一般的なストリームっぽいオブジェクトに対しても有効な
> アルゴリズムはどうなるかって事も考えて見たい、、、。

まじめに読んでなかったんですが、map_with_index を使って、

format = (["%-35s"] * ARGV.size).join(" | ")
handles = ARGV.map{|f| open(f)}
while (lines = handles.map_with_index {|h, i| h and (h.gets or handles[i] = h.close)}).find{|x| x}
  print format % lines.collect{|l| l.to_s.chomp}, "\n"
end

とか?

この場合、なんで map じゃなくて map_with_index が必要かというと、要素
を変更する必要があるからで、これは perl の foreach の VAR が代入可能で
あるとか、Iteration Abstraction in Sather で CLU の問題として指摘され
ている 3つのうちの No way to modify elements にあたるとか、けっこう一
般的な話で... などと知ったばかりの蘊蓄を垂れてみたりして。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)