&引用;Can';“不要让限定名”;使用clojure.core.match时
我正在使用并看到以下错误: 不能让限定名 我的代码类似于:&引用;Can';“不要让限定名”;使用clojure.core.match时,clojure,pattern-matching,clojure-core.match,Clojure,Pattern Matching,Clojure Core.match,我正在使用并看到以下错误: 不能让限定名 我的代码类似于: (match [msg-type] [MsgType/TYPE_1] (do-type-1-thing) [MsgType/TYPE_2] (do-type-2-thing)) 其中MsgType/TYPE_1来自Java类: public class MsgType { public static final String TYPE_1 = "1"; public static final
(match [msg-type]
[MsgType/TYPE_1] (do-type-1-thing)
[MsgType/TYPE_2] (do-type-2-thing))
其中MsgType/TYPE_1
来自Java类:
public class MsgType {
public static final String TYPE_1 = "1";
public static final String TYPE_2 = "2";
}
这个错误是什么意思?我该如何解决它呢?这个问题似乎存在,尽管我对它的理解不深,因为我对宏还很陌生
最初,我希望使用而不是match
将证明是一种可行的解决方法:
(case msg-type
MsgType/TYPE_1 (do-type-1-thing)
MsgType/TYPE_2 (do-type-2-thing))
但是,上述方法不起作用<代码>大小写匹配符号MsgType/TYPE\u n
,而不是该符号的求值
到目前为止,我发现最好的方法是将输入的值转换为关键字并进行匹配:
(def type->keyword
{MsgType/TYPE_1 :type-1
MsgType/TYPE_2 :type-2})
(case (type->keyword msg-type)
:type-1 (do-type-1-thing)
:type-2 (do-type-2-thing))
一般来说,模式匹配不是比较一个变量和另一个变量的正确工具。模式应该是文本,例如
1
或:a
,解构要绑定的表达式或变量。例如,以这个表达式为例:
(let [a 1
b 2]
(match [2]
[a] "It matched A"
[b] "It matched B"))
由于变量B
等于2,您可能希望它生成“it matched B”,但实际上它将值2绑定到名为a
的新变量,并生成“it matched a”
我想你在找condp=
。这基本上就是你所希望的情况
(condp = msg-type
MsgType/TYPE_1 (do-type-1-thing)
MsgType/TYPE_2 (do-type-2-thing))