Clojure'包含'的问题

时间:2012-08-15 02:01:17

标签: vector clojure contains

我正在使用Closure Box阅读一些Clojure教程,并输入以下代码:

user> (def stooges (vector "Moe" "Larry" "Curly"))
#'user/stooges
user> (contains? stooges "Moe")
false

这不应该评估为TRUE吗?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:14)

这是一个常见的陷阱!我记得当我开始使用Clojure时会陷入这个问题: - )

contains?检查集合中是否存在索引(0,1,2等)。

您可能需要以下内容:

(some #{"Moe"} stooges)
=> "Moe"    <counts as boolean true>

(some #{"Fred"} stooges)
=> nil      <counts as boolean false>

或者您可以定义自己的版本,例如:

(defn contains-value? [element coll]
  (boolean (some #(= element %) coll)))

(contains-value? "Moe" stooges)
=> true

答案 1 :(得分:11)

矢量类似于数组。如果集合中存在true,则contains?会返回key。您应该寻找“密钥/索引”0,1或2

user=> (def stooges (vector "Moe" "Larry" "Curly"))
#'user/stooges
user=> (contains? stooges 1)
true
user=> (contains? stooges 5)    
false

如果你使用哈希......

user=> (def stooges {:moe "Moe" :larry "Larry" :curly "Curly"})
#'user/stooges
user=> (contains? stooges :moe)
true
user=> (contains? stooges :foo)
false

正如迈克拉所说,你可能想要clojure.core/some

之类的东西

答案 2 :(得分:7)

包含?支持Set,如果你使用clojure-1.4

user=> (contains? #{:a, :b} :a)
true

user=> (contains? (set stooges) "Moe")
true