Проблема с Clojure 'содержит'
Я читаю несколько учебников Clojure, используя Closure Box, и ввел следующий код:
user> (def stooges (vector "Moe" "Larry" "Curly"))
#'user/stooges
user> (contains? stooges "Moe")
false
Должно ли это оцениваться как ИСТИНА? Любая помощь приветствуется.
Ответы
Ответ 1
Вектор похож на массив. contains?
возвращает true
, если 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
Как предлагает mikera, вы, вероятно, хотите что-то вроде clojure.core/some
Ответ 2
Это обычная ловушка! Я помню, как попадал в этот, когда я начинал с Clojure: -)
содержит? проверяет наличие индекса (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
Ответ 3
содержит? support Set, если вы используете clojure -1.4
user=> (contains? #{:a, :b} :a)
true
user=> (contains? (set stooges) "Moe")
true