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

欢迎!请参阅关于页面以了解更多有关此功能的信息。

0投票
编译器

调用class将返回对象类的一个实例,该实例将打印为类名,但实际上很难使用(例如在case分支中)。拥有一个辅助函数来返回对象类的符号表示将很有帮助。

我认为我们不太可能添加这个功能,这似乎相当简单,你可以自己做。
嘿,我猜也是。如果你在乎的话,提出一个顶层答案,我会将其标记为完成。
我们可以让它保持开放,并看看随着时间的推移是否会累积一些东西,这只是我的第一印象。

2 个答案

+1

完成这件事的最简单方法是

(case (.getName (class c))
  "java.lang.String" "We got a string!"
  "[[I"              "An array of arrays of int.")

我建议只使用字符串而不是尝试使它们成为符号,因为Java类的名称可能会变得很奇怪,如果它是一个数组,则开头有方括号,如果它是一个嵌套类,则包含嵌入的美元符号。

还要记住,只有一个名称不足以唯一标识一个类;你可能有不同类加载器加载的具有相同名称的类,这些类加载器相互之间不兼容。然而,对于大多数考虑这种情况的case表达式的情形,这可能不会是一个问题。

0投票

(symbol (.getName cls))

你仍然不能用它与case一同使用,因为它期望的是字面量而不是绑定/表单。但你可以使用(condp = ...),尽管在这种情况下,可能更合适的是与instance?一起使用。

我想到了 `(case (class obj) java.some.Class :a java.other.Class :b)`。
...