我正在开发 Clojure API,但遇到了本地图内的项目计数发生变化时 Clojure 在 HashMap
和 ArrayMap
之间自动“类型切换”的问题。
阅读文档:https://clojuredocs.org/clojure.core/array-map#example-57392e25e4b071da7d6cfd0c
假设我有一个像这样的 POST 请求:
(POST "/" []
:body [foo FooSchema]
(create-response ok {:message "foo!"}))
FooSchema
定义如下:
(def ArrayMap clojure.lang.PersistentArrayMap)
(def Bar ArrayMap)
(s/defschema FooSchema
{:id s/Str
:bar Bar})
:bar
作为 JavaScript 对象发送,其结构如下:
{
id: 1,
fh: 1,
rdstr: "flying"
}
如文档中所述,如果 :bar
对象在 body
中返回的项目少于 9 个,那么它将生成 ArrayMap,这可以正常工作。无论如何,当:bar
对象缩放并返回超过9个项目时,请求失败,返回错误:
(not (instance? clojure.lang.PersistentArrayMap a-clojure.lang.PersistentHashMap))
因为 :bar
自动(神奇地)切换到 HashMap
。
反之亦然,如果我将 :bar
的架构类型设置为 HashMap
,那么少于 9 个项目的对象也不起作用。
无论如何,我们总是可以强制类型为HashMap
?
最佳答案
这两种类型都过于具体。您应该使用更通用的类型,表示任何类似 map 的内容。显而易见的选择是 clojure.lang.IPercientMap
。
关于java - Clojure:定义模式中的 HashMap 和数组映射类型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48664388/