From: Hideto ISHIBASHI Date: 2000-03-15T04:52:39+09:00 Subject: [ruby-list:21437] Re: 引数コピーとオブジェクト指向 石橋秀仁です。 Date: Tue, 14 Mar 2000 23:27:55 +0900 Message-ID: <200003141427.XAA02569@hoyogw.netlab.co.jp> > ただただしです。 >  とりあえず、「dupだけが唯一の正解」というのは、自らの代案をもって撤回 > します。unfreezeがなくてホントによかった(笑)。 ぼくもdupとfreezeの両方に賛成。複数の解決策があってこそ"TMTOWTDI"ですね。 >  ほめられちった:-) initializeで例外をあげるということは、問題があれば > Personインスタンス生成時に必ずこれを感知できるということです。これをや > らない、もしくはPersonがnameを内部で勝手にfreezeをした場合、時間的・場 > 所的に遠く離れた場所で誰かがsub!をしてしまったらそのデバッグはかなりコ > ストがかかることになります(製品が出荷されちゃったあととかね)。 >  あ、でもConstantStringは「書き換えた時に初めて例外が出る」ので、上に > あげたような理由であまり親切じゃないと(私は)思います。 なるほど。たしかに親切度では劣りますね。うっかり。でも、次のような 使い方を想定したものでした。 require 'amstd/must' # 青木さんの`must.rb' class Person def initialize( name ) # raise StandardError, "name must be fronzen." if not name.frozen? name.must ConstantString @name = name end attr_reader :name ... end 実際、ConstantStringは``frozen String''に別名を与えただけですから。 クラスとしての名前があれば、OOA/Dするときに便利だと思いました。 +-------------------------------+ | Person | +-------------------------------+ | name : String | +-------------------------------+ | + name() : String | | + rename( new_name : String ) | +-------------------------------+ と書いていた`String'を、場合により`ConstantString'と書ける。 それだけ。くどいけど「人間のため」です。 ただし、Rubyには似合わない「型チェック」です。frozenなStringでも 例外になるので、あくまでクラス図を書くような開発のときにしか 有効じゃありませんけどね。 # ほんとうに静的型がほしければ、Javaでも使えばいいかもしれない。 # しかし、RubyでもStringだけは「純粋な属性」として使いたい。趣味の問題。 -- Hideto "rubyholic" ISHIBASHI