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 中的任何函数之前将输入转换为字符串。
...