From: Fuyuhiko Maruyama (=?ISO-2022-JP?B?GyRCNF07M0VfSScbKEI=?=) Date: 2000-02-23T15:47:11+09:00 Subject: [ruby-list:20984] Re: Hash#update について 丸山です。 At Wed, 23 Feb 2000 13:39:00 +0900, matz@netlab.co.jp (Yukihiro Matsumoto) wrote: > |私のイメージとしては、 > |> self[key] = yield(self[key], y[key]) > |この部分が、 > | self[key] = iterator? ? yield(self[key], y[key]) : y[key] > |みたいになっているものです。これなら、updateメソッド(別にこの名前にこだ > |わっているわけではないです;-)がブロックを伴う場合の動作だけを新たに定義 > |すればよいことになります。 > > むむむ、このupdateの新挙動をもうちょっと厳密に定義してみてく > ださいませんか? たとえばkeyがどちらかにのみあった場合とか。 余り難しいことを考えているのではないです。 hash1とhash2の二つのHashオブジェクトについて、hash1.update(hash2)とす る場合を考えます。 *現在のupdateメソッド 1. 片方にしかないkeyについては、update後には唯一存在したkey-valueの組 がhash1に格納される。 2. 両方に同じkeyが存在した場合は、hash2のvalueがhash1のkey-valueとして 格納される。 *私の考えているupdateメソッド 1. 片方にしかないkeyについては、update後には唯一存在したkey-valueの組 がhash1に格納される。 2. 両方に同じkeyが存在する場合 - updateメソッドがブロック無しで呼ばれた時は、hash2のvalueを hash1[key]に格納する。 - updateメソッドがブロック付きで呼ばれた時は、hash1[key]と hash2[key]の二つのvalueをパラメータとしてブロックを評価し、その結 果をvalueとしてhash1[key]に格納する。 つまり、Hash#updateメソッドにおいて、二つのHashオブジェクトに同じkeyに 対する要素があった場合に、ブロックを用いて、二つのvalueのどちらを採用 するかを指定できる。という部分が、追加したい挙動です。ブロック無しで呼 ばれた場合の振る舞いは今までと同じになります。 > |これをアプリケーションレベルで書くのっていやだなぁ……と思いませんか? > > 汎用にしようと思うからこんなに書くわけでその場に固有の処理だっ > たらこの1/4で済むでしょう? 実のところ、固有の処理として実装した時に、その操作は上のように一般化す ることができるじゃないか……と考えて、提案してみました。 Rubyはオブジェクト指向言語ですから、ちゃんと書いておけば、拡張性を高め ておくことができますよね。つまり、ちょっとしたアプリケーションですら、 アプリケーションフレームワーク的なものとして将来使われることになるかも しれないわけです。おかげで、頑張って書きたくなってしまうのは、私の性分 のせいかもしれません。 -- 丸山冬彦 東京工業大学 情報理工学研究科 数理計算科学専攻 松岡研究室 mailto:fuyuhik8@is.titech.ac.jp http://matsu-www.is.titech.ac.jp/%7emaruyama/