2013-02-22 49 views
1

方案的eqv-hashtable數據結構似乎無法識別字符串鍵。在下面的代碼,我創建一個eqv-hashtable並創建一個新的數據:無法識別字符串的散列表鍵

(define state-hash (make-eqv-hashtable)) 
(hashtable-set! state-hash "S" (State "S" #f '() '())) 

然而,當我嘗試檢查,看看我的數據存儲在哈希表,我會遇到以下:

(hashtable-contains? state-hash "S") ; --> #f 

雖然hashtable-contains?過程表明,關鍵"S"目前沒有在哈希表,下面另有暗示:

(hashtable-keys state-hash) ; --> #("S") 

如果我使用密鑰以外的字符串,例如符號(例如, 'S),我沒有任何問題。任何想法爲什麼它不喜歡一個字符串作爲關鍵?

回答

3

eqv?回報#t只有當它的參數是指完全一樣目的。試試這個:

(define key "S") 
(define state-hash (make-eqv-hashtable)) 
(hashtable-set! state-hash key (State "S" #f '() '())) 
(hashtable-contains? state-hash key) 
+0

啊,當然。我忘了那個'eqv?'謂詞。這是有道理的。另一種選擇可能是使用'(make-hashtable)',我認爲它可以傳遞不同的謂詞。在這種情況下,我不想對'eqv?'進行測試,但是'相等'。所以也許這是要走的路。 – dtg 2013-02-22 23:55:59

+0

@Dylan沒錯,如果你不需要使用對象_equivalence_來更好地遵守_equality_,它會使事情變得更簡單。乾杯! – 2013-02-22 23:58:01