Hay funciones convenientes para este propósito in the Tupelo library. En particular, las funciones contains-elem?
, contains-key?
y contains-val?
son muy útiles. La documentación completa está presente in the API docs.
contains-elem?
es el más genérico y está destinado a vectores o cualquier otro clojure seq
:
(testing "vecs"
(let [coll (range 3)]
(isnt (contains-elem? coll -1))
(is (contains-elem? coll 0))
(is (contains-elem? coll 1))
(is (contains-elem? coll 2))
(isnt (contains-elem? coll 3))
(isnt (contains-elem? coll nil)))
(let [coll [ 1 :two "three" \4]]
(isnt (contains-elem? coll :no-way))
(isnt (contains-elem? coll nil))
(is (contains-elem? coll 1))
(is (contains-elem? coll :two))
(is (contains-elem? coll "three"))
(is (contains-elem? coll \4)))
(let [coll [:yes nil 3]]
(isnt (contains-elem? coll :no-way))
(is (contains-elem? coll :yes))
(is (contains-elem? coll nil))))
Aquí vemos que para un rango de números enteros o un vector mixta, contains-elem?
funciona como se espera para los dos existentes y la no elementos existentes en la colección. Para los mapas, también podemos buscar cualquier par clave-valor (expresado como un vector len-2):
(testing "maps"
(let [coll {1 :two "three" \4}]
(isnt (contains-elem? coll nil))
(isnt (contains-elem? coll [1 :no-way]))
(is (contains-elem? coll [1 :two]))
(is (contains-elem? coll ["three" \4])))
(let [coll {1 nil "three" \4}]
(isnt (contains-elem? coll [nil 1]))
(is (contains-elem? coll [1 nil])))
(let [coll {nil 2 "three" \4}]
(isnt (contains-elem? coll [1 nil]))
(is (contains-elem? coll [nil 2]))))
También es fácil de buscar un conjunto:
(testing "sets"
(let [coll #{1 :two "three" \4}]
(isnt (contains-elem? coll :no-way))
(is (contains-elem? coll 1))
(is (contains-elem? coll :two))
(is (contains-elem? coll "three"))
(is (contains-elem? coll \4)))
(let [coll #{:yes nil}]
(isnt (contains-elem? coll :no-way))
(is (contains-elem? coll :yes))
(is (contains-elem? coll nil)))))
para mapas & conjuntos , es más simple (& más eficiente) a utilizar contains-key?
para encontrar una entrada de mapa o un elemento de conjunto:
(deftest t-contains-key?
(is (contains-key? {:a 1 :b 2} :a))
(is (contains-key? {:a 1 :b 2} :b))
(isnt (contains-key? {:a 1 :b 2} :x))
(isnt (contains-key? {:a 1 :b 2} :c))
(isnt (contains-key? {:a 1 :b 2} 1))
(isnt (contains-key? {:a 1 :b 2} 2))
(is (contains-key? {:a 1 nil 2} nil))
(isnt (contains-key? {:a 1 :b nil} nil))
(isnt (contains-key? {:a 1 :b 2} nil))
(is (contains-key? #{:a 1 :b 2} :a))
(is (contains-key? #{:a 1 :b 2} :b))
(is (contains-key? #{:a 1 :b 2} 1))
(is (contains-key? #{:a 1 :b 2} 2))
(isnt (contains-key? #{:a 1 :b 2} :x))
(isnt (contains-key? #{:a 1 :b 2} :c))
(is (contains-key? #{:a 5 nil "hello"} nil))
(isnt (contains-key? #{:a 5 :doh! "hello"} nil))
(throws? (contains-key? [:a 1 :b 2] :a))
(throws? (contains-key? [:a 1 :b 2] 1)))
Y, para los mapas, también puede buscar Valu í con contains-val?
:
(deftest t-contains-val?
(is (contains-val? {:a 1 :b 2} 1))
(is (contains-val? {:a 1 :b 2} 2))
(isnt (contains-val? {:a 1 :b 2} 0))
(isnt (contains-val? {:a 1 :b 2} 3))
(isnt (contains-val? {:a 1 :b 2} :a))
(isnt (contains-val? {:a 1 :b 2} :b))
(is (contains-val? {:a 1 :b nil} nil))
(isnt (contains-val? {:a 1 nil 2} nil))
(isnt (contains-val? {:a 1 :b 2} nil))
(throws? (contains-val? [:a 1 :b 2] 1))
(throws? (contains-val? #{:a 1 :b 2} 1)))
como se ve en la prueba, cada una de estas funciones cuando funciona correctamente para la búsqueda de nil
valores.
Extraño de hecho, ¿contiene? tiene que ser la función con el nombre más engañoso en Clojure :) ¿Aquí está la esperanza de que Clojure 1.3 lo cambie de nombre a contains-key? o similar. –
Creo que ahora se habla de muerte varias veces. contiene? no cambiará. Consulte aquí: http://groups.google.com/group/clojure/msg/f2585c149cd0465d y http://groups.google.com/group/clojure/msg/985478420223ecdf – kotarak
@kotarak gracias por el enlace. De hecho estoy de acuerdo con Rich aquí en cuanto al uso del contenido? nombre aunque creo que debería ser alterado para arrojar un error cuando se aplica a una lista o secuencia – mikera