2024 Clojure状态调查!分享您的想法。

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

+1
集合
编辑

一如既往地感谢 Clojure — 我们热爱它,并且每天都在使用它来解决令我们作为程序员感到愉快,并令我们的用户惊叹的问题。


我天真地拿集合差分,希望得到这个结果,并感到很高兴

> (clojure.set/difference #{:a :b :c} '(:a 1 2))
#{:c :b}

然后我做了这个,感到惊讶

> (clojure.set/difference #{:a :b :c} '(:a 1 2 3))
Execution error (IllegalArgumentException)
contains? not supported on type: clojure.lang.PersistentList

然后我阅读了 clojure.set/difference 的实现,现在我明白了

https://github.com/clojure/clojure/blob/a29f9b/src/clj/clojure/set.clj#L49-62

但,我确实想知道,如果这样就能工作的话会更有趣。由于这对我的重要性可能比你更大,我想知道这里的真实权衡是什么。

  • 是性能吗?
  • 或者,在关键时刻隐式转换为实现了 contains? 的东西会有什么负面影响?

1 答案

+1

选中
 
最佳答案

https://clojure.atlassian.net/browse/CLJ-2433(以及其中引用的相关票据)。

这很可能是一些新手在使用 clojure.set 时都可能会问到的问题,因此应该把它放在 https://clojure.org/guides/faq 中:clojure.set 函数只在集合上定义——文档字符串中并没有说明传递非集合对象会发生什么。

by
感谢链接——我学到了很多。我绝对赞成实现 `clojure.set/difference` 的一个版本,它接受一个序列作为第二个参数。在我的情况下,我已经发现了一个使用 `(apply disj ...)` 的不错的解决方案。继续加油。
...