杉浦です。

>>> In Message "[ruby-ext:02221] Re: VFS for ruby"
>>>            <874qyeb63j.fsf / serein.a02.aist.go.jp>,
>>> Tanaka Akira <akr / m17n.org>  said;
> > 現時点でで参考になるような実装はありますでしょうか?
> > # Java?

> 正直な所、OO な言語で、その OO な機能を直接使って、というのはあまり見
> 当たりませんが、例としては、Jakarta の Commons Virtual File System が
<Snip...>

ありがとうございます。
Jakarta の物については一応知っていたのですが、java.io.File やその他
紹介していただいた物を一通り見てみることにします。

> あとは、OO な言語ではなくなりますが、Tcl の VFS は Tcl_Filesystem をク
<Snip...>
> PHP5 にもストリームというのが入るようですが、PHP の OO 機能をそのまま
<Snip...> 
> 他にも OO でない言語で書かれたものは C の gnome-vfs, AVFS, podfuk や
> elisp の tramp とか、いろいろあるようです。おそらく、それらでも Tcl と
> 同様に、共通インターフェースの定義があり、それはクラスに対応すると考え
> られるはずです。たぶん。

うーん。この辺の関数言語関連はファイルの抽象化と言うより、IO と操作の
透過性(?)が主眼なのですよね。OO じゃないので当たり前と言えばそうなのですが。

AVFS と podfuk は知りませんでした。
これも見てみます。

> > File.new("url") で各スキームハンドラ固有のインスタンスを返します。
> > これは path (と言うより url) だけを必ず覚えていて、インスタンス
> > メソッドでその URL から導かれる実際のファイル(じゃないかもしれませんが
> > とにかくデータの実体)に対して操作をすると言うスタイルです。

> 私だったら、スキームハンドラなんて導入せずに、単に URI::HTTP とかを使
> いますが。だから、open-uri.rb は URI::HTTP#open などを提供するわけです
> けど。

なるほど。下にあげていただいた例で分かりました。
逆から辿ったという事なのかな?

既存の組み込み File, Dir クラスとの互換性を最優先に考えたので、組み込み
クラス(のクラスメソッド)と同じインスタンスメソッドを持った空っぽのクラスを
定義して……と言うところから始めました。

結局このスキームハンドラ(って言って良いのか良く分かりませんけど)は
URI::* + pathname みたいなものになるはずですが、現状では組み込み
File, Dir 互換のメソッドを提供する所までしか来ていません。

> > すみません、イメージがいまいち掴めていません。
> > この場合、パス名や URI のクラスが実際の操作を受け持つと言うことでしょうか?

> 1.8.0 の時点で

> require 'pathname'
> require 'open-uri'

> def m(x)
>   x.open('r') {|f| f.each_line {|line| puts line } }
> end

> m Pathname.new("/home/...")
> m URI.parse("http://...")

コード例ありがとうございます。良く分かりました。

> というかんじで使えるわけで、必要に応じてメソッドをつけていけばほぼ十分
> だと思っています。

書き込みオープン等の事を考えると URI や pathname の拡張ではやりにくい
ように思いました。まあ、結局何処ににメソッドを置くかとか、どのクラスの
メソッドを呼ぶかの違いでしかないのですが……

-- 
Tatsuki Sugiura   mailto:sugi / nemui.org