From: keiju@... (ÀÐÄͷ½¼ù ) Date: 1997-01-31T05:27:45+09:00 Subject: [ruby-list:1987] Re: [Dist] Mutex module けいじゅ@SHLジャパンです. In [ruby-list :01981 ] the message: "[ruby-list:1981] Re: [Dist] Mutex module ", on Jan/30 18:58(+0200) sinara@blade.nagaokaut.ac.jp writes: >内容一致の方はキーを失い安いけど、ハッシュを引く時はむしろ逆で >すよね。 id の方は厳しい。やっぱり、 > >hash[ [0,1] ] = 1 >p hash[ [0,1] ] # ==> nil > >という状況は避けたい気がする。 はっきりさせるためには, もうちょっと原則論から攻めた方がよいですね. ハッ シュ値がマッチするのは, 基本として==ですから値が等しい時です. つまり, 2つの配列の値が等しいとは, どういうことかということを考えれば良いでしょ う. 2つの配列が等しいとは: 1. 内容, つまり, 全ての要素が等しい 2. オブジェクトid, つまり, オブジェクトが等しい. >やっぱり食いかけたパンの値段が値段表に載ってないのは当たり前で >は?ちょっと大きさの違うパンに値段がつかないのは表の定義が悪い。 >パン一個一個に値段をつけるのはくど過ぎるのではないでしょうか? 若干例えが悪いような... ある1つキーウィに値段がついていたとして, それが数日たって食べごろ(オブ ジェクトの状態の変化)になったら値段が分からなくなっていたという感じで しょうか... # 腐りかけになると値段が下がるという話しもありますが(^^;;; 同じオブジェクトなのに状態の変化によってハッシュが引けなくなるのは問題 です. とここまで考えてきて, 文字列はフリーズされているということを思い出しま した... いまの仕様だと以下のようになりますね? h = Hash.new a = "foo" h[a] = "bar" a.concat "baz" h[a] #--> nil つまりオブジェクトの同一性よりも値(それも登録された時の)が重要視されて いるわけですね. このこと自身に文句をいうつもりはありませんが, 対称性からいって, 他のオ ブジェクトをキーにする時もちゃんと値をフリーズしないといけないですね. そのためにはオブジェクトのコピーをキーにしなくてはならないと思うのです が, rubyでは, o1 == o2 => o1.hash = o2.hash は求められていますが, o1 == o1.copy は求められていましたっけ? とはいったものの, 一般のオブジェクトのコピーをキーにするのはコストがか かり過ぎますよね. 一番いいのは, キーをフリーズするかどうかをオプション で指定できるとよいのですが... h = Hash.new(:key_freeze) >キーとキーと比較されるオブジェクトがごっちゃになってるなあ。 >値段表としてサンプルに使ったパンに手をつけるべきでない、とい >うべきか。(これは異論もあるでしょうね。) ハッシュ(の仕様)とは関係はないのですが, ちょっと気になったもので... オブジェクト指向の世界ではオブジェクトの状態は変わり得るというふうに考 えるべきだと思います. 原さんのここでの意見を聞いていると, オブジェクト指向ベース(ruby)の考え 方ではなくて値ベース(perl)で考えているようにも感じられます. オブジェク ト指向では値よりもオブジェクト, すなわちオブジェクトのアイデンティティ を基本に考えるべきだと思います. # これは前に議論のあった, 変数とオブジェクトの問題に通じていると思いま # す. >> これを踏まえて,以下のいずれが望ましいでしょう? >> (a) Hash/Arrayともidで一致を取る >> (b) Hash/Arrayとも内容で一致を取る >> (c) Hashはidで一致を取る/Arrayは内容で一致を取る >> (d) Hashは内容で一致を取る/Arrayはidで一致を取る >> (e) 上記以外のなにか(ってなに?) >なんとなく (c)。Hash はオブジェクトではなく、関数だと割り切る。:-) > >Hash を Hash に入れたくなる様な例がほしい。 ハッシュを関数と考えるならば, 関数からの写像がまさにハッシュをハッシュ に入れた例ですよね. 数学の言葉を使えば, 汎関数ですね(^^;;; それはさておいて, 最初に述べたことをもう一度繰り返しますが, この場合2 つのハッシュの値が等しいとはどういう場合かということで考えれば問題はもっ とはっきりすると思います. 2つのハッシュが等しいとは: 1. 内容, つまり, 全てのkeyとvalueが等しい 2. オブジェクトid, つまり, オブジェクトが等しい. 私の意見は: 配列の場合もハッシュの場合も本質的には変わらないので, idで比較するにし ても, 内容で比較するにしても統一する方が後々間違いの原因にならないです むだろうと思うということです. __ .....................................石塚 圭樹@SHLジャパン(株)... ------------->アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----