You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ş

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:43:22