似乎存在一个bug,其中一条规则使用`:only`限定符以确保map具有特定的键集。如果匹配的值是向量,将抛出`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指出,为map模式生成的形式将对任何值为`ILookup`的项执行map检查,但如果使用`:only`限定符,则检查可能包括对`.keySet`的调用。
建议将此处对ILookup的引用更改为`IPersistentMap`。经过此更改,CLJ测试仍然通过。