杉浦です。

>>> In Message "[ruby-ext:02231] Re: VFS for ruby"
>>>            <87wub9neg2.fsf / serein.a02.aist.go.jp>,
>>> Tanaka Akira <akr / m17n.org>  said;
> > いえ、単に「ファイル抽象化クラス」と「ディレクトリ抽象化クラス」を
> > 分けたかっただけです。

> 理解しました。ファイルを扱うときは File.new, ディレクトリを扱うときは
> Dir.new を使うんですね。

> でも、一般にはあるパス名がファイルを指しているのかディレクトリを指して
> いるのかはわからないわけで、それをあらかじめどちらなのか知っていないと
> いけないというのは困る事があるのではないでしょうか。

パス名そのものの操作(dirname,Pathname#cleanpath...etc)は、File, Dir
の両方のクラスで同じように出来れば良いのではないでしょうか。
# と言ってもまだ実装してませんが……

結局パス名が指す実体への操作(open, entries...etc) をするときには、調べ
ないといけないわけで、余り手間は変わらない気がします。

> 例えば、vfs の Dir#entries は文字列の配列を返しますが、pathname の
> Pathname#entries は Pathname の配列を返します。
<Snip...>

私もその方が良いと思っています。

が、VFS::Dir が今のところ String を返すのは、組み込みクラスとの
互換性のためです。

ファイル名の連結やアルファベットソートなら、<=> や + 等のメソッドを
定義すれば良いのですが(そしてするつもりですけれど)、例えば

Dir.open("/path/to/dir/").entries.sort_by { |f| f.size }

とした時に、f が「ファイル抽象化クラス」という位置づけならば size()
でパス名のサイズではなくファイルサイズを返したいところです。

仕方ないので Dir#each_obj とか Dir#file_entries とかでも作ろうかと
考えてはいますが、悩ましいですね。
# いっそ互換モードと非互換モードを選べるように……は、まずそうか……

> > # ディレクトリはファイルクラス(でもパスでも良いですが)の配列(もしくは
> > # コレクション)の様に扱えると直感的で良いなぁと思うのですが……

> 配列を返すメソッドを用意するのでは不十分でしょうか?
> (Pathname#entries のように)

クラスが "パス名" ならその方が良いと思いますが、明示的に "ディレクトリ"
だと指定してインスタンスを作ったなら、そこから更に entries を呼ば
ないといけないのは面倒に思います。

元々、組み込み Dir を使っていて、「openが面倒」「IO みたいなものが
帰ってくるのが面倒」と言うのがあったので、 Dir#[](aFixnum),
Dir#grep, Dir#map 等は出来るようにしたいです。


あとはエントリ数が膨大な場合は、配列を作って返すよりも、Dir.each
を呼ぶと、裏側で順次 IO から読んでエントリを返してくれる方がメモリー
消費等の点で嬉しい──

──かと思っていたんですが、今試してみるとメモリ消費は全然大したこと
ありませんね。
# それにローカルファイル以外だと結局エントリのキャッシュを持つ事に
# なるでしょうし。

エントリの後の方の要素を一気に取り出す際、そのまま配列の様に
Dir.new("/dir")[10000]
とか出来るなら、多少効率を上げられるかもしれませんが……

-- 
Tatsuki Sugiura   mailto:sugi / nemui.org