基本上,我想要一个像这样工作的函数:
user=> (pos 'c '(a b c d e f g) =)
2
user=> (pos 'z '(a b c d e f g) =)
nil
我想出了这个:
(defn pos
"Gets position of first object in a sequence that satisfies match"
[object sequence match]
(loop [aseq sequence position 0]
(cond (match object (first aseq)) position
(empty? aseq) nil
:else (recur (rest aseq) (inc position)))))
所以我的问题是,是否有一些内置函数可以让我们这样做,或者是否有更好的,更实用的/ Clojure-ish方式来编写pos
函数?
答案 0 :(得分:5)
好吧,如果您真的想要查找特定项目,可以在集合上使用.indexOf
;如果你想用谓词做更通用的事情你不需要函数和一个项目,那么只需要一个函数。
(defn pos [pred coll]
(->> coll
(map-indexed #(when (pred %2) %1))
(remove nil?)
(first)))
user> (pos #{'c} '(a b c d e f g))
2
另一方面,有一个原因不包含在clojure.core中:它不是很有效,你很少关心集合中的索引 - 如果你这样做,你通常应该重新考虑你的算法。