2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面以了解更多有关如何使用本页面的信息。

+1
core.match

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

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

2 个回答

0
0
by

请注意,类符号表示类实例,它们不是常量,不应出现在展开的代码中。因此,需要特别注意在这里展开成可以在运行时适当匹配的对象。我认为这可能可行,但这可能比看起来要复杂一些。

...