请分享您的观点,参加 2024 年 Clojure 状态调查!

欢迎!请查阅 关于 页面以了解更多关于如何使用本站的信息。

0
语法和读取器

(= (map :name (mapify (parse (slurp filename)))) '("Edward Cullen" "Bella Swan" "Charlie Swan" "Jacob Black" "Carlisle Cullen" "Joni balap"))
=> true

(clojure.string/includes? (map :name (mapify (parse (slurp filename)))) "Joni")
=> false

(clojure.string/includes? '("Edward Cullen" "Bella Swan" "Charlie Swan" "Jacob Black" "Carlisle Cullen" "Joni balap") "Joni")
=> true

1 答案

+3

选中
 
最佳答案

让我们看看 clojure.string/includes? 如何描述其所做之事及其实现

user=> (doc clojure.string/includes?)
-------------------------
clojure.string/includes?
([s substr])
  True if s includes substr.
nil
user=> (source clojure.string/includes?)
(defn includes?
  "True if s includes substr."
  {:added "1.8"}
  [^CharSequence s ^CharSequence substr]
  (.contains (.toString s) substr))
nil
user=> (.toString (map :name [{:name "One"} {:name "Two"}]))
"clojure.lang.LazySeq@26e067"
user=> (.toString ["One" "Two"])
"[\"One\" \"Two\"]"
user=>

我们看到它假设其第一个参数是字符串 -- 或者更具体地说是一个 CharSequence -- 然后从调用该参数的 .toString 开始。

我们看到 (.toString (map .. ..)) 生成了一个看起来很神秘的字符串,但这是因为 map 产生了一个惰性序列,惰性序列的默认字符串表示是它的类型和十六进制值,就像任何没有特定字符串表示的 Java 对象一样。

但是,对一个引用列表或向量调用 .toString 会生成列表或向量的元素字符串表示。

因此,在后者的情况下,clojure.string/includes? "works",即使您没有传入一个 CharSequence,当它将数据结构转换为字符串时,也会包含您正在寻找的名称。

由于您想检查序列中的任何元素是否包含该字符串,您可能在这里想要的可能是

(some #(clojure.string/includes? % "Joni") (map :name (mapify ..)))
明白了...
非常感谢您回答我的问题,这对我的帮助很大!
关于这一点——toString 是用来将 CharSequence 转换为 String 的。虽然它确实会将许多其他东西转换为字符串,但这应该被视为未定义的行为,并且在调用 clojure.string 中的任何函数之前,应该将输入转换为字符串。
...