在 core.match
中进行 Class 对象匹配时,默认情况下,用于命名 Class 对象的符号被视为通配符模式,就像任何其他符号一样。基本用法文档显示了此行为,并建议局部重新绑定以获取预期的行为。
重新绑定是一个合适的解决方案,但我在编写或阅读代码时发现,很容易忽略缺少的绑定。另一个解决方案可能是使用全限定类名
(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
没有命名空间且包含一个或多个点的符号在一般情况下指示类名,如 记录,并且在局部绑定中无效(因此出现错误),因此支持此语法不应与其他任何可能的符号含义冲突。