请求解析Clojure中含reduce函数的代码执行逻辑
对Clojure中reduce这段代码执行逻辑的解释
你的核心误解是对reduce的参数传递逻辑理解错了:reduce不会把整个集合传给x,而是逐个遍历集合里的元素,每次将当前元素赋值给x,同时把上一轮的累加结果赋值给r。
这段代码里reduce的三个参数分别是:
- 匿名函数
(fn [r x] (if (nil? x) r (conj r x))):负责处理每一轮的累加逻辑 []:初始累加值(也就是第一轮的r)[:mouse nil :duck nil :lory nil]:要遍历处理的集合
下面是逐轮执行的详细过程:
第一轮迭代
- 当前累加值
r = [],当前元素x = :mouse - 执行判断:
nil? :mouse为false,调用(conj [] :mouse),得到新的累加值[:mouse]
- 当前累加值
第二轮迭代
- 当前累加值
r = [:mouse],当前元素x = nil - 执行判断:
nil? nil为true,直接返回当前累加值[:mouse],累加值不变
- 当前累加值
第三轮迭代
- 当前累加值
r = [:mouse],当前元素x = :duck - 执行判断:
nil? :duck为false,调用(conj [:mouse] :duck),得到新的累加值[:mouse :duck]
- 当前累加值
第四轮迭代
- 当前累加值
r = [:mouse :duck],当前元素x = nil - 执行判断:
nil? nil为true,直接返回当前累加值[:mouse :duck],累加值不变
- 当前累加值
第五轮迭代
- 当前累加值
r = [:mouse :duck],当前元素x = :lory - 执行判断:
nil? :lory为false,调用(conj [:mouse :duck] :lory),得到新的累加值[:mouse :duck :lory]
- 当前累加值
第六轮迭代
- 当前累加值
r = [:mouse :duck :lory],当前元素x = nil - 执行判断:
nil? nil为true,直接返回当前累加值[:mouse :duck :lory]
- 当前累加值
遍历完所有元素后,reduce返回最终的累加值,也就是你看到的[:mouse :duck :lory]。
内容的提问来源于stack exchange,提问作者leydovordu
相关产品推荐
相关产品推荐

