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?在后者中“工作”是因为,即使你没有传递CharSequence,当它将数据结构转换为字符串时,它包含了你要找的名字。

既然你想要检查序列中的任何元素是否包含该字符串,那么你可能希望这样:

(some #(clojure.string/includes? % "Joni") (map :name (mapify ..)))
by
啊哈,我明白了....
非常感谢您的回答,这对我帮助很大!
by
继续这个话题 - toString的作用是将CharSequence转换为String。虽然它确实有将很多其他东西字符串化的副作用,但这应该被认为是不确定的行为,你应该在调用clojure.string中的任何函数之前将输入转换为字符串。
...