java - Clojure:定义模式中的 HashMap 和数组映射类型冲突

标签 java clojure hashmap compojure

我正在开发 Clojure API,但遇到了本地图内的项目计数发生变化时 Clojure 在 HashMapArrayMap 之间自动“类型切换”的问题。

阅读文档: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/

相关文章:

macros - Clojure 的乐趣,宏

clojure - 如何使用 ClojureScript 和 Figwheel 与后端通信?

Java:查找两个 HashMap 的匹配键

java - 如何从另一个 Java 项目读取文件

java - Alpha Beta 修剪似乎并没有提高我的国际象棋 minimax 性能

java - Switch 语句中的枚举无法解析

java - 如何动态创建串行命名的类对象?

clojure - 在 Clojure 中将多个过滤器应用于画眉中的集合

java - 从 HashMap 中检索的值的顺序是插入顺序吗

Java - 使用 HashMap 和 List<> 作为键