请在 2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解如何工作的更多信息。

0
Java 互操作
这会生成一个反射警告


(let [id-1 3
      id-2 1
      id-3 2
      ids [id-1 id-2 id-3]]
  #(compare (.indexOf ids %1) (.indexOf ids %2)))
;; => 调用 clojure.lang.IPersistentVector 上的 indexOf 方法无法解析(没有此方法)。


这不是问题


(let [ids [3 2 1]]
  #(compare (.indexOf ids %1) (.indexOf ids %2)))


唯一的不同之处在于向量的元素是否为文字,这不应该影响对 indexOf 的调用。

2 个答案

0

评论者:alexmiller

我认为这里发生的情况是,在第一种情况下,它被类型化为 PersistentVector(由读取器读取的具体数据结构)。PV 实现了 Collection,因此不需要反射。

在第二种情况下,向量需要评估,其类型为 IPersistentVector(接口)。IPV 未扩展 Collection(它与该接口独立)因此找不到 indexOf 方法。

从这两种情况中退出来,我们正在对一个我们期望是 Collection 的对象进行 Java 互操作。我在是否应该在我们这里对其进行互操作时期望 ids 带有此信息有些犹豫。这取决于您如何看待抽象的 Clojure 向量集合是 Java 集合(与一个实现相比)。

我认为这不容易以干净的方式“修复”。

0
参考:https://clojure.atlassian.net/browse/CLJ-2382(由 alex+import 报告)
...