在 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
没有命名空间且包含一个或多个点的符号在通常情况下被记录为表示类名,并且在局部绑定中不起作用(因此引发错误),所以支持这种语法不应与符号的任何其他可能的含义发生冲突。