core.match 允许您为 match 子句中的一个值命名,如下所示(来自示例)
(let [x 1 y 2]
(match [x y]
[1 b] b
[a 2] a
:else nil))
在此示例中,如果第一个匹配值是 one,那么在用于生成结果的表达式中,第二个值将可以在 name 下访问b
。
因为 match 子句中的任何符号都被解释为将相应值绑定到该名称的指令,所以在您的情况下,名称Integer
被绑定到该值java.lang.String
user> (match [(class "3.14")]
[Integer] Integer
[Double] "Doubler")
java.lang.String
user> (match [(class "3.14")]
[name-to-bind] name-to-bind
[Double] "Doubler")
java.lang.String
从文档中不清楚是否有一种方法可以使用 core.match 来评估 match 子句而不是绑定到它。可以通过匹配一个字符串来解决这个问题,尽管它失去了一些优雅:
user> (match [(str (class (int 3)))]
["class java.lang.Integer"] "Integer"
["class java.lang.String"] "String"
["class java.lang.Double"] "Double")
"Integer"
user> (match [(str (class "3.14"))]
["class java.lang.Integer"] "Integer"
["class java.lang.String"] "String"
["class java.lang.Double"] "Double")
"String"
user> (match [(str (class 3.14))]
["class java.lang.Integer"] "Integer"
["class java.lang.String"] "String"
["class java.lang.Double"] "Double")
"Double"