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)`。
...