From: matz@... (Yukihiro Matsumoto) Date: 2002-01-05T03:48:49+09:00 Subject: [ruby-dev:15632] Re: rb_hash_initialize まつもと ゆきひろです In message "[ruby-dev:15628] Re: rb_hash_initialize" on 02/01/05, Takaaki Tateishi writes: |> これって具体的にはなにを意味するんでしょうか? | |例えば, | | hash = Hash.new{|h,key| h[key] = key[0] + key[1]} | |としたときに, | | hash[1,2] | # => 3 | |とできるといいなと思っていました. まず第一に、Hash#[]に複数の値を指定することについては、Array やStringと(Collectionとしての性質が似ているのに)意味が変化し てしまうので躊躇しています。 たとえば、 h = {1=>2, 2=>4, 3=>6, 4=>8} h[1,3,4] => [2,6,8] とかの意味をもってほしいと思う人もいるでしょうし、違う意味で とらえる人もいるでしょう。結局混乱のもとのように感じます。 第二に、立石さんの望みである |単純に,Proc,Methodと同じように扱いたかったというだけです. というのが全然理解できません。HashとProcになんの関連性がある のでしょうか? HashがProcのようにcallに反応してなんの嬉しい 点があるのか理解できません。一方、callを与えることにより、単 なるデフォルト値の計算方法のひとつにしかすぎないHashのブロッ クに必要以上の意味を与えることにはデメリットだと思います。 実際にはデフォルト値の計算にinitializeに与えたブロックを使う というのは Hash#default メソッドの振る舞いに過ぎませんし、 defaultメソッドをオーバーライドすれば変化してしまう挙動です。 |Hash#call というのも Hash の意味からはずれてしまう気もしますが, |実行結果をキャッシュするという使われ方をする場合には,call があ |る方が良い気がします. えー、どうして? なんでHashにcallが? |ところで,初期化のためのブロックは,Hashオブジェクト自身も引数 |にとり, | | Hash.new{|h,key| h[key] = key + 1} | |としますが, | | Hash.new{|key| key + 1} | |としなかったのは,他のキーに対する値を変更できるという理由からで |しょうか? ブロックからHash自身をえる確実な方法がほかにないからです。 まつもと ゆきひろ /:|)