えぐち です。 私がシーケンスを守ってないんでリプライの順序が変ですが、、 =Subject: [ruby-list:4618] Re: Object#freeze= > 前田です。 > > In message "[ruby-list:4609] Re: Object#freeze" > "EGUCHI Osamu" <eguchi / shizuokanet.or.jp> wrote: > > |> `template method'で意図したのはインターフェイスだけ提供して > |> 実装は何もないメソッドということです。 > | > |virtual member function ? > > virtualってC++のvirtualでしょうか? > 言いたかったのは > > class Object > def freeze > end > end > >ということでした。 どちらかというと純粋仮想関数ですね、 派生クラスでは、「絶対定義しなきゃだめ」を強制できませんが、 強引に、 class Object define freeze raise 'Undefined method freeze.' end end って方法もないではないですが。 > |> クラスライブラリの変更だけで済むような方法の方がよいのでは > |> ないでしょうか。 > | > |インタープリタ側で実装しようというのは > |「$-I をいかなる方法でも書き換え不能にする」 > |という話題が元になっていたため私の頭の中では > |ライブラリがロードされる前に既に read-only で > |frozen な状態に出来ないかという部分が大きかったのです。 > |そうでなければ特異メソッドなどを駆使して実現できると思います。 > > クラスライブラリと書いたのはビルトインクラスも含めてです。 了解です、今までの話題がビルトインでしたものね。 ^^; > 現在のrubyでインスタンス変数を変更するメソッドが検出できると > 思ってなかったので...。 ここ詳しく知りたいです。 ビルトインクラスのインスタンスへの変更を例外なり、特異メソッド なりで捕捉できれば非常にきれいな表現になりそうなんですが、、 > $:などの問題についてはimmutableなArrayを用意するだけで > 十分なのではないでしょうか。 そうおもいます。 immutableの意味付けとして 1) Array#<< で例外発生! 2) []= でも例外発生! 3) += でも = でも例外発生! のような非常に deep なものとしてです。 1)、2)はオブジェクトの性質 3)は変数の性質なので、ぜんぜん別個のことですけど。