在 `core.match` 中匹配类对象时,默认将用于命名类对象的符号视为模式通配符,就像其他任何符号一样。基本用法文档 展示了此行为,并建议局部重新绑定以获得预期行为。
重新绑定是一个足够的解决方案,但我发现,在读或写代码时,很容易忽略缺失的绑定。另一种解决方案可能是使用完全限定的类名
(match [(type 1)]
[java.lang.String] :string
[java.lang.Long] :long
:else :no-match)
采用这一约定后,开发者不必查看比模式本身更大的任何范围,就可以知道类名是否能够正确解析,这有助于在阅读代码时找到错误(可能也有助于为此进行代码审查)。
然而,这种语法目前尚不受支持
Syntax error (ClassFormatError) compiling fn* at (REPL:1:1).
Illegal field name "java.lang.String" in class user$eval1591
没有任何命名空间且包含一个或多个点的符号,通常 记录 为指示类名,在局部绑定中不起作用(因此出现错误),因此支持这种语法不应与符号的任何其他可能含义发生冲突。