From: matz@... (Yukihiro Matsumoto) Date: 1997-01-31T12:52:23+09:00 Subject: [ruby-list:1990] Hash of Hash/Array(Re: [Dist] Mutex module) まつもと ゆきひろです. In message "[ruby-list:1987] Re: [Dist] Mutex module" on 97/01/31, 石塚圭樹 writes: | |けいじゅ@SHLジャパンです. |いまの仕様だと以下のようになりますね? | |h = Hash.new |a = "foo" |h[a] = "bar" |a.concat "baz" |h[a] #--> nil | |つまりオブジェクトの同一性よりも値(それも登録された時の)が重要視されて |いるわけですね. なんかこの辺,バグっているんでちゃんと動かないような気がしま すが,今の「仕様」はそうです. |このこと自身に文句をいうつもりはありませんが, 対称性からいって, 他のオ |ブジェクトをキーにする時もちゃんと値をフリーズしないといけないですね. まず,対称性に関しては NO です.文字列がコピー/フリーズされ ているのは特別扱いの例外で,これを一般のオブジェクトに適用す るつもりはありません. |そのためにはオブジェクトのコピーをキーにしなくてはならないと思うのです |が, rubyでは, o1 == o2 => o1.hash = o2.hash は求められていますが, |o1 == o1.copy は求められていましたっけ? Hashが比較に使っているのは"=="でなくて"eql?"です.で,現在の 仕様ではo1.eql? o1.cloneは求められていません.ただし,ドキュ メントはo1 == o1.cloneは求められているつもりで書いてます. |配列の場合もハッシュの場合も本質的には変わらないので, idで比較するにし |ても, 内容で比較するにしても統一する方が後々間違いの原因にならないです |むだろうと思うということです. HashとArrayでは性質も使われ方も違いますから必ずしも揃えてお く必要はないと思います.もちろん他に理由がなければわざわざ違 える必要もないわけですが. まつもと ゆきひろ /:|)