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 投票

请注意,类符号表示类实例,它们不是常量,不应包含在展开代码中。因此,需要特别小心以将其扩展为能够在运行时适当匹配的内容。我认为这是可能的,但可能比看起来要复杂一些。

...