From: Keiju ISHITSUKA Date: 2002-08-05T00:50:22+09:00 Subject: [ruby-list:35706] Re: scope-in-state [Re: new mathn [Re: Rational#to_int ~ String#center]] けいじゅ@日本ラショナルソフトウェアです. In [ruby-list:35645] the message: "[ruby-list:35645] Re: scope-in-state [Re: new mathn [Re: Rational#to_int ← String#center]]", on Jul/26 17:04(JST) Shin-ichiro HARA writes: >原です。 >すばらしー、大傑作ではないでしょうか。 ありがとうございます. >これで、多くの問題がうやむやに、、、いや、解決できますね。(^^ うーむ... >私も似たようなことを考えていたんですが、スレッドを考えると難しくて >やめてしまいました。 > >思いつくままに意見を: > > >モジュールSは状態を表しているつもりです. ここで, S::FooはFooに追加さ > >れるモジュール, S::BarはBarに追加されるモジュールです. 一度に複数のク > >ラスの振る舞いを変えることができないと意味がないので, こんな感じになり > >ました. 上記の場合 S::Mod1::Mod2::Mod3は Sを取ったもの, つまり > >Mod1::Mod2::Mod3に追加されます. > >複数のモジュールを同時に考えると便利ではあるけれど、そのために使 >い方が、ちょっと手間が必要になっていないかなあ。ネストができるの >だから素朴に (中略) >みたいなインターフェースだと見た目がいいかも。しかし、Foo.in_state >が Foo の状態を替えるところが気持ち悪いかな。 で, 原さんのimport-moduleなわけなんですね? この件に付いては別メイルで. > >1. 上記のような単純な場合はわかりやすいが, ベースのクラスが継承したり > > includeしていたりすると, どう動作するのか想像しがたい. > > >1.は, 状態スコープで定義されたものが優先されるはずです. 概念的にはベー > >スクラスで定義されたメソッドを状態に応じて変えるので, ベースクラスのメ > >ソッドと同レベルと判断したからです. > >include されたモジュールのメソッドに関してもすげ替えができるようになっ >たらうれしいなあ。つまり、 (中略) >みたいに。 うーん. これはモジュールの入れ替えですよね. これはきっと実現できなさそ う... これと同値のものとして, 以下のならできます. module M0 def foo; 0; end end class Foo include M0 end module S module M0 def foo; 1; end end end ScopeS = ScopeInState.new(S) class Foo # <- ここがみそ include M0 end foo = Foo.new p foo.foo #=> 0 ScopeS.scope_in do p foo.foo #=> 1 end p foo.foo #=> 0 ただ... 『ここがみそ』のところを実行しないとだめなんですが... ScopeInState.newでM0の継承列が変更されるのですが, rubyではそれがFooに 伝達されませんので... ただ, これは解決できなくはないので解決できると思うのですが... # それともruby-1.7では解決されましたっけ? 昔MLで話題になったと思います # が, 結果を忘れてしまいました(^^;;; > >2. 状態スコープのネスティングができるようになっているが, そのため実装 > > が複雑&&実行コストがかかっている > >このモジュールは整数の割り算とか、頻繁に実行される基礎的なメソッ >ドにも使われる可能性が大なわけですよね。だから、実行コストの問題 >は、実験してみないとわからないけど、非常に大きいかもしれませんね。 > >scope の入り口と出口でメソッド書き換えるのが、多分そのメソッドの >実行コストは一番小さいけど、そうするとマルチスレッドと両立できな >いですよね。ただ、大きなコストの差があるなら、そういうバージョン >も欲しいです。 で, 原さんのimport-moduleの実装になるわけですか... 仕様と実装は分けて かなえるべきだとおもいますが, 原さんの実装は参考になりそうなところも多 いなと感じました. __ ..............................石塚 圭樹@日本ラショナルソフトウェア... ----------------------------------->> e-mail: keiju@rational.com <<---