我对{{core.match}}非常新手,刚刚开始玩。 在此过程中,我有一个这样的示例
(for [x [[1 2 3]
[1 2 3 4]
{:a 17, :b 2}
{:a 23, :b 7}]]
(match [x]
[[a b c]] [a b c]
[{:a a, :b 2}] {:a a}
[{:a (a :guard odd?), :b b}] {:a a, :b b}
:else :no-match))
它报错,信息是??"IllegalArgumentException 参数必须是整数::clojure.core.match/not-found clojure.core/even? core.clj:1351)"??. 问题在于将关键字{{:clojure.core.match/not-found}}传递给{{:guard}}函数{{odd?}},它将其传递给{{even?}}。
我可以通过确保我的guard只接受整数来修复它
(for [x [[1 2]
[1 2 3]
[1 2 3 4]
{:a 17, :b 2}
{:a 23, :b 7}]]
(match [x]
[[a b c]] [a b c]
[{:a a, :b 2}] {:a a}
[{:a (a :guard #(and (integer? %)
(odd? %))), :b b}] {:a a, :b b}
:else :no-match))
但是,guard为什么必须处理{{:clojure.core.match/not-found?}} 是否具有意义?在我看来,上面的例子中所有匹配的映射值都是整数,因此似乎我可以有一个只接受整数的guard。