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

Clojure中take-while无法处理字符串的问题及解决方法咨询

在Clojure中对字符串使用take-while的正确姿势

这个问题的核心其实是Clojure对字符串的处理逻辑和Scala/Haskell不一样——在Clojure里,字符串是字符的序列,而不是字符串数组,所以你之前的判断条件没匹配到正确的类型,才导致take-while没有按预期工作。

先分析你遇到的问题根源

你写的判断条件#(not= % " ")里,%拿到的是字符串中的单个字符(比如空格对应的\space),而不是字符串" "。Clojure严格区分字符类型(char)和字符串类型(String),所以(not= \space " ")永远返回true,take-while自然会把整个字符串的所有字符都返回。

同理,你把字符串转成向量后,里面的元素还是字符(比如(vec "apple")得到[\a \p \p \l \e]),此时用#(not= % "p")判断,\p和字符串"p"是不同类型的对象,永远不相等,所以条件一直为真,返回整个序列。

正确的写法

只需要把判断条件里的字符串换成对应的字符即可:

1. 处理空格分隔的字符串

;; 先获取符合条件的字符序列
(take-while #(not= % \space) "chich and chong")
;; 输出: (\c \h \i \c \h)

;; 如果需要转成字符串,用`apply str`拼接字符序列
(apply str (take-while #(not= % \space) "chich and chong"))
;; 输出: "chich"

2. 处理apple的例子

(apply str (take-while #(not= % \p) "apple"))
;; 输出: "a"

额外小提示

如果记不清字符的写法,也可以用char函数生成对应字符,比如(char 32)就是空格字符,但直接写\space(或者针对单个字母写\a、\p)会更直观。

内容的提问来源于stack exchange,提问作者prayagupadhyay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:41