作者yzugsr (Bird)
看板Ruby
標題[Ruby] Using hash object as keys of hash...
時間Thu Jan 3 17:35:39 2008
我最近寫了個程式,使用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
1F:推 godfat:port 到 ruby 1.9 就完全符合預期了 :o 剛剛測試的 01/03 23:24
2F:→ yzugsr:冏 所以是1.8的bug 1.9fix了喔 @@ 01/04 00:40
3F:推 godfat:我想不一定是 bug, 當初可能有什麼考量,後來決定改了 01/04 00:51
4F:→ yzugsr:恩恩 感謝 01/04 00:51