clojure.string上的take-while不起作用

时间:2018-01-28 03:12:08

标签: clojure

我想知道为什么clojure不会像scala或haskell那样将字符串视为数组。

我希望字符串上有take-while函数,如下面的scala

scala> "chich and chong".takeWhile(_ != ' ')
res1: String = chich

但是take-while in clojure似乎不适用于字符串。

user=> (take-while #(not= % " ") "chich and chong")
(\c \h \i \c \h \space \a \n \d \space \c \h \o \n \g)

只是为了确保char / string在clojure中有效,

user=> (= " " " ")
true

user=> (not= 'A " ")
true

take-while仅适用于矢量。

user=> (take-while #(< % 0) [-3 -2 -1 0 1 2 3])
(-3 -2 -1)

尝试将字符串转换为矢量,但返回与输入相同。

user=> (vec "apple")
[\a \p \p \l \e]

user=> (take-while #(not= % "p") (vec "apple"))
(\a \p \p \l \e)

如何在clojure.string中使用take-while?

2 个答案:

答案 0 :(得分:4)

你应该用空格写字符文字而不是字符串:

user=> (take-while #(not= % \space) "chich and chong")
=> (\c \h \i \c \h)

那是因为:

  • " " - java.lang.String
  • \space - java.lang.Character

更多信息\ - Character literal

答案 1 :(得分:0)

只是要指出您的代码可以在ClojuseScript中运行,因为主机平台(JavaScript)没有字符类型,因此字符表示为单字符字符串。在JVM上虽然字符有自己的类型。