[Ruby] Using hash object as keys of hash...
我最近寫了個程式,使用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
01/03 23:24, 1F
→
01/04 00:40, , 2F
01/04 00:40, 2F
推
01/04 00:51, , 3F
01/04 00:51, 3F
→
01/04 00:51, , 4F
01/04 00:51, 4F
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章