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

欢迎!请参阅关于 页面获取有关此平台更多信息。

0
编译器

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

我认为我们可能不会添加这个,这听起来很容易自己制作。
heh 我猜就是如此。做好顶层回答,如果这些对你来说很重要的话,我会将其标记为已完成。
我们可以将其保持开放,并随着时间的推移看看是否能积累一些内容,这只是我的第一印象。

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