Я попытался использовать непосредственно hashmap Clojure с MapDB и столкнулся с странным поведением. Я проверил источники Clojure и MapDB и не смог понять проблему.Использование структуры данных Clojure с помощью MapDB
Сначала все выглядит отлично:
lein try org.mapdb/mapdb "1.0.6"
; defining a db for the first time
(import [org.mapdb DB DBMaker])
(defonce db (-> (DBMaker/newFileDB (java.io.File. "/tmp/mapdb"))
.closeOnJvmShutdown
.compressionEnable
.make))
(defonce fruits (.getTreeMap db "fruits-store"))
(do (.put fruits :banana {:qty 2}) (.commit db))
(get fruits :banana)
=> {:qty 2}
(:qty (get fruits :banana))
=> 2
(first (keys (get fruits :banana)))
=> :qty
(= :qty (first (keys (get fruits :banana))))
=> true
CTRL-D
=> Bye for now!
Тогда я пытаюсь получить доступ к данным снова:
lein try org.mapdb/mapdb "1.0.6"
; loading previsously created db
(import [org.mapdb DB DBMaker])
(defonce db (-> (DBMaker/newFileDB (java.io.File. "/tmp/mapdb"))
.closeOnJvmShutdown
.compressionEnable
.make))
(defonce fruits (.getTreeMap db "fruits-store"))
(get fruits :banana)
=> {:qty 2}
(:qty (get fruits :banana))
=> nil
(first (keys (get fruits :banana)))
=> :qty
(= :qty (first (keys (get fruits :banana))))
=> false
(class (first (keys (get fruits :banana))))
=> clojure.lang.Keyword
Каким же самое ключевое слово отличается относительно =
? Есть ли какая-то странная проблема с эталоном?
Похоже, что что-то не так с mapdb. '(def k? (first (keys (get fruits: banana))))' '(= k? (ключевое слово (name k?)))' => 'false' – noisesmith
Взяв другой взгляд - mapdb специально не сделан для поддержки типов данных Clojure. Я вовсе не удивлен тем, что родные родовые инструменты сериализации Java не действительно правильно используют ключевые слова Clojure. Я думаю, что это похоже на классическую проблему с serializing booleans и false, которые не работают должным образом. Вы можете захотеть clj-mapdb (хотя он все еще находится в бета-версии API). – noisesmith