Clojure中不用filter函数筛选奇数转向量及if函数无返回值处理
问题1:手动筛选奇数并放入向量
你当前的代码存在几个问题:
map会遍历每个元素并返回对应处理结果,当条件不满足时if省略了else分支,默认返回nil,最终结果里会混杂这些nil(into [] cat x)完全没必要,你需要的是保留奇数本身,而非用cat处理单个数字
如果要手动实现(不用filter),最贴合学习目的的方式是用reduce逐步构建目标向量:
(reduce (fn [acc x] (if (odd? x) (conj acc x) ; 是奇数就添加到结果向量中 acc)) ; 不是就保持原向量不变 [] ; 初始空向量 (range 0 10))
运行后结果就是[1 3 5 7 9],完全符合你的期望。
如果坚持想用map,需要先过滤掉结果里的nil再转成向量:
(into [] (remove nil? (map (fn [x] (if (odd? x) x)) (range 0 10))))
问题2:if条件不满足时避免返回nil
首先要明确:Clojure里所有表达式必须返回一个值,不存在“完全不返回任何内容”的情况。if省略else分支时默认返回nil,这是语言本身的特性。
如果不想让nil出现在最终结果里,要根据使用场景处理:
- 在序列处理(比如筛选奇数的场景),可以用
reduce跳过不满足条件的元素,或者用remove nil?过滤掉nil - 若是单独的
if表达式,你可以给else分支指定一个可接受的默认值(比如空序列、空字符串等),但无法让它“不返回”
比如之前用reduce的写法,条件不满足时直接返回原累积向量,相当于跳过非奇数元素,最终结果里自然不会出现nil。
内容的提问来源于stack exchange,提问作者Barış Can Ateş
相关产品推荐
相关产品推荐

