似乎存在一个 Bug,其中子句使用 `:only
` 特征以确保映射包含一组特定的键。如果要匹配的值是向量,将会抛出 ClassCastException
异常。
以下是一个按预期工作且不使用 `:only
` 的示例。
(let [x []]
(match [x]
[{:k v}] :a-map
:else :not-a-map))
=> :not-a-map
如果我们稍微调整一下添加 `:only
`,则会抛出意外的错误。
(let [x []]
(match [x]
[({:k v} :only [:k])] :a-map
:else :not-a-map))
;; Execution error (ClassCastException) at ...
;; clojure.lang.PersistentVector cannot be cast to java.util.Map
Slack 用户 @FiVo 识别到为映射模式生成的形式将在任何 ILookup
值上执行映射检查,但如果使用 `:only
` 特征,则检查将包括对 `.keySet
` 的调用。
建议将此处对 ILookup 的引用更改为 `IPersistentMap
`。在此更改后,CLJ 测试仍然通过。