让我们看看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 ..)))