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
相关产品推荐
相关产品推荐

