请在 Clojure 2024 年调查问卷 中分享您的想法!

欢迎!请查看关于页面以获取有关如何使用本站的更多信息。

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

(符号 (.getName cls))

由于它期望字面量而不是绑定/形式,您仍然不能使用它与case一起,但您可以使用(condp = ...),尽管在这种情况下使用instance?可能更有意义。

我正在考虑 `(case (class obj) java.some.Class :a java.other.Class :b)`。
...