Clojure中(some #{:fred} coll)惯用法的工作原理及底层机制咨询
惯用法
(some #{:fred} coll) 的工作原理 1. some 函数的基础作用
some 是Clojure的高阶函数,它会遍历传入的集合 coll,对每个元素 x 执行 (pred x),返回第一个逻辑真值(非nil、非false的值);如果所有元素执行后都无逻辑真值,就返回nil。
2. 集合能当函数用的核心原因
Clojure里的集合(Set、Map、Vector)都实现了IFn接口,这意味着它们可以像函数一样被调用,不同类型集合的调用逻辑不同:
- Set集合:当把Set当作单参数函数调用时(比如
(#{:fred} x)),本质是检查x是否存在于Set中:- 若
x在Set里,返回x本身(逻辑真) - 若
x不在Set里,返回nil
- 若
- Map集合:当作函数调用时,传入的参数是键,返回对应的值;键不存在则返回
nil(比如({:a 1} :a)返回1,({:a 1} :b)返回nil) - Vector集合:当作函数调用时,传入的参数是索引,返回对应位置的元素;索引越界则抛出异常(比如
([1 2 3] 0)返回1)
3. 这个惯用法的具体流程
回到 (some #{:fred} coll):
some遍历coll中的每个元素x- 对每个
x执行(#{:fred} x):- 若
x是:fred,返回:fred(逻辑真),some立刻终止遍历并返回这个值 - 若
x不是:fred,返回nil,some继续遍历下一个元素
- 若
- 如果遍历完所有元素都没找到
:fred,some返回nil
这个写法比手动写(some (fn [x] (= x :fred)) coll)更简洁,是Clojure里检查集合是否包含指定元素的常用惯用法。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

