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(由阅读器读取的 concrete 数据结构)。PV 实现了 Collection,因此不需要反射。

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

回想一下,我们在 Java 交互对一个期望是 Collection 的对象进行操作。我在是否应该期望 ids 在这里进行交互时携带这个信息上有疑虑。这取决于你认为抽象的 Clojure 向量集合是 Java 集合的程度(与其实现相比)。

对我来说,这似乎不容易以干净的方式“修复”。

0
参考资料:https://clojure.atlassian.net/browse/CLJ-2382(由 alex+import 提出)
...