Issue with Clojure 'contains'

前端 未结 3 1108
心在旅途
心在旅途 2021-01-11 19:21

I am going through some Clojure tutorials using Closure Box, and entered the following code:

user> (def stooges (vector \"Moe\" \"Larry\" \"Curly\"))
#\'u         


        
相关标签:
3条回答
  • 2021-01-11 20:13

    This is a common trap! I remember falling into this one when I was getting started with Clojure :-)

    contains? checks whether the index (0, 1, 2, etc.) exists in the collection.

    You probably want something like:

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

    Or you can define your own version, something like:

    (defn contains-value? [element coll]
      (boolean (some #(= element %) coll)))
    
    (contains-value? "Moe" stooges)
    => true
    
    0 讨论(0)
  • 2021-01-11 20:20

    contains? support Set, if you use clojure-1.4

    user=> (contains? #{:a, :b} :a)
    true
    
    user=> (contains? (set stooges) "Moe")
    true
    
    0 讨论(0)
  • 2021-01-11 20:23

    A vector is similar to an array. contains? returns true if the key exists in the collection. You should be looking for the "key/index" 0, 1 or 2

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

    If you were using a hash...

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

    As mikera suggests, you probably want something like clojure.core/some

    0 讨论(0)
提交回复
热议问题