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

欢迎!请访问关于页面,了解有关此工作方式的更多信息。

+2
Clojure
编辑

也许Clojure核心可以考虑使用一个函数

(defn index-of [coll elt] ...)

这将有助于在您当前需要编写的地方

(.indexOf something :foo)
这是很丑陋的,因为您需要了解持续向量或其他类型实现的某些方面。

index-of函数可以适用于clojure.lang.Indexed、java.util.List和java.lang.String实例,并且这可能可以用协议进一步扩展。

我明白index-of在性能方面不是一个理想的功能,但它有其用例。

这个函数应该被推广为一个返回(延迟的)索引序列而不是只有一个第一个索引的函数吗?

1 答案

0

clojure.string/index-of对于字符串情况存在。对于colls,过去已经考虑并拒绝了一些类似的票证(在我的脑海中是https://clojure.atlassian.net/browse/CLJ-2056,但我想可能还有其他)。

by
> 线性查找(尤其是嵌套线性查找)的使用会导致性能不佳

是的,我明白这一点,但我看到有人在使用 `.indexOf` 进行互操作性调用,这让我有点困扰,因为这依赖于内部实现。
by
将稍微不同的维度引入这个话题—— 回到 2010 年,一位 Clojure 贡献者在大脑集团中回复说:

由于 95% 的时间使用 `.indexOf` 检查集合中的元素(如果是单次使用,可以使用 (some #(= item %) coll)),所以不将其放在核心中以提高更适合的数据类型(集合、映射)。
by
我的观点是标准化:我不希望在 babashka 上支持 `.indexOf` 在向量上,因为那会暴露实现细节,所以最好是有一个核心函数来完成这个工作,或者确实推荐使用 `some` 方法。
by
“some 方法”会告诉你某个东西是否是集合的成员,但它不会告诉你它在集合中的位置(基本上,它是在询问,谓词对集合中的某个元素返回 true 吗,并相应地返回 true/null)。但这并没有告诉你某个东西在集合中的位置。好几次我想在一个核心的 `index-of` 函数中找到所有顺序集合(任何可以响应 `nth` 的东西)。我通常用于需要统计数据类型的程序,其中我希望说给定的数据值代表某个百分位数。所以先对集合排序,找到元素索引,然后除以元素数量等。是的,它有线性时间界限。这并没有阻止 `clojure.string/index-of` 的使用。是的,对于排序数据,实现二分查找会更好。这也会在核心中非常有用(仅限于向量)。
...