我有一個名爲袋子的defrecord。它的行爲與要計數的項目列表相似。這有時被稱爲頻率或人口普查。我希望能夠做到以下幾點我如何獲得核心clojure函數與我的defrecords一起工作
(def b (bag/create [:k 1 :k2 3])
(keys bag)
=> (:k :k1)
我試過如下:
(defrecord MapBag [state]
Bag
(put-n [self item n]
(let [new-n (+ n (count self item))]
(MapBag. (assoc state item new-n))))
;... some stuff
java.util.Map
(getKeys [self] (keys state)) ;TODO TEST
Object
(toString [self]
(str ("Bag: " (:state self)))))
當我嘗試要求它在REPL我得到:
java.lang.ClassFormatError: Duplicate interface name in class file compile__stub/techne/bag/MapBag (bag.clj:12)
這是怎麼回事上?我如何在我的包包上獲得鑰匙功能?通過假設clojure的按鍵函數最終在地圖上調用getKeys(它的參數),我是否也會通過這種正確的方法來解決這個問題?
有趣。謝謝。有一個原因,這不是一個香草地圖。如果我對生活在行星上的人進行普查:我可能想要類似以下的東西:(得到行星地球)=> 80億(得到行星火星)=> 0。一個香草地圖將給我火星上的零個人,除非我使用得到行星火星0)。我不希望客戶必須知道這一點。 – 2010-09-19 03:33:14