お世話になっております。 A.中村です。

On Tue, 14 Dec 1999 02:59:51 +0900
matz / netlab.co.jp (Yukihiro Matsumoto) wrote:

>|実装は殆どスカにしてinclude先で実装してもらうつーか、Rubyのような動的な言語の場合、そんな無理矢理な継承関係を作る必要は無くて、必要なメソッドをもっていさえすれば構わないわけですよね。

理想モード:

まぁそうなんですが、そーすっと結局、Stream(able)という
「作法」を共有する術が事実上ないことになっちゃうんで
ちょっと寂しいなと。
勿論module Streamableなんて作る「必要は無い」のは
確かっす。書いたとしても下記みたいになっちゃう。

module Streamable
  def each_byte
    super #こればっかり
  end
  def close
    super #うわっ無駄かつ馬鹿
  end
end

#中身が「super」しか書いてないメソッドって
#メソッドキャッシュは見逃してくれるんでしょうか?無茶?

うーん。静的言語では型によって「代用」されているところの、
この「作法の表現」って奴を、Rubyとかでも表現出来るような
イイ方法はないもんでしょうかね…

-------------------
ゲンジツモード:

まぁ、open(new),close,read,write,position,position=,size,size=
があればとりあえずいいのかも。

rewindableじゃないstreamはposition=できない。
writableじゃないstreamはsize=できない。
ってことはrewindable?,writable? も無いと困る(例外を
出さずにチェックしたいこともあろうから)かな。
rewindable=とwritable=は取り敢えず無視…

んで、どれも「実装としては」プリミティブなものばかりなんで
templete methodみたいな派生的実装の話はまた後日って感じですよね。
#でも[],[]=くらいはあるかな。

でも上記のような「作法」は、確かに存在するように感じる。
このギャップ、どうしよう…

-------------------
過去モード:

templete methodを作るとしたら、むしろ逆に、過去との互換の
ためのmoduleを作ることになるんじゃないかと思いました。
IOに依存した既存オブジェクトに対してIOでないstreamを与えるとき
streamをIOであるように見せかけるtemplete method moduleを
streamに噛ませればいい。textファイル風の改行分割処理とかも
そこでやればいい。

ん?つまり、話が逆だったのかな俺?

これで話が逆になっちゃうところがまず残念だという
思いはあるが…
つまりは「IOの抽象度が低い」という残念さ。