[Ruby] Using hash object as keys of hash...

看板Ruby作者 (Bird)時間17年前 (2008/01/03 17:35), 編輯推噓2(202)
留言4則, 2人參與, 最新討論串1/1
我最近寫了個程式,使用hash當作hash的鍵值,但發現了一些問題.. irb(main):001:0> a = {1=>2} => {1=>2} irb(main):002:0> b = {1=>2} => {1=>2} irb(main):003:0> c = {} => {} irb(main):004:0> c[a] = 1 => 1 irb(main):005:0> c[b] = 1 => 1 irb(main):006:0> c => {{1=>2}=>1, {1=>2}=>1} 這裡看似一個hash裡有兩個相同的鍵值,為何會這樣呢?? irb(main):007:0> a==b => true irb(main):008:0> a.eql?b => false irb(main):009:0> a.hash == b.hash => false 原來根據eql?的定義,他們是不相等的。另外他們的hash值也不同 我找到一些文章,與我的觀查結果相同,卻沒有說明這樣設計的緣由 http://www.ruby-lang.org.cn/forums/thread-697-1-1.html 最後我直接修改Hash類別.. class Hash def hash sum = 0 self.each do |key, value| sum += key.hash sum += value.hash end sum end def eql?(rhs) return self==rhs end end 這樣使用起來就相安無事了.... 這樣完全沒有問題嗎? 有的.... 就是當hash object出現在自己的key或value的時候 irb(main):001:0> a = {} => {} irb(main):002:0> a[a] = a => {{...}=>{...}} irb(main):004:0> a.hash 這樣會stack overflow 不過這個問題應該很容易避免。 例如傳遞額外的optimal parameter, 或者用一個class variable記住目前的遞迴...?? 想問問有沒有人也有這樣的經驗?我這樣的改法會不會有什麼問題 (反正我目前在寫的是小程式,在這支程式沒發生問題就好了 XD) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.124.99.126

01/03 23:24, , 1F
port 到 ruby 1.9 就完全符合預期了 :o 剛剛測試的
01/03 23:24, 1F

01/04 00:40, , 2F
冏 所以是1.8的bug 1.9fix了喔 @@
01/04 00:40, 2F

01/04 00:51, , 3F
我想不一定是 bug, 當初可能有什麼考量,後來決定改了
01/04 00:51, 3F

01/04 00:51, , 4F
恩恩 感謝
01/04 00:51, 4F
文章代碼(AID): #17VAnkJK (Ruby)
文章代碼(AID): #17VAnkJK (Ruby)