使用包含的Falsy返回值?功能

时间:2016-02-17 21:05:50

标签: clojure

我不确定我在这里做错了什么:

(defstruct prefix :a :b :c :d :e)

(def peN (struct prefix "pen" "pe" "pem" "peng" "peny"))

(contains? peN "pen") ;=> false

我希望它能回归真实。也许我没有使用包含?是否正确?

2 个答案:

答案 0 :(得分:4)

首先,defstruct is deprecated;你应该使用defrecord代替:

(defrecord Prefix [a b c d e])

(def pen (->Prefix "pen" "pe" "pem" "peng" "peny"))

(contains? pen "pen") ;=> false

现在,为什么这次呼叫contains?会返回false?好吧,记录基本上只是具有一些额外功能的地图(在这种情况下无关紧要),所以这相当于

(def pen {:a "pen" :b "pe" :c "pem" :d "peng" :e "peny"})

(contains? pen "pen") ;=> false

现在,如果我们查看contains?的文档字符串,我们可以找到答案:

  

如果给定集合中存在key,则返回true,否则返回false。

在这种情况下,我们集合中的一组键是

(keys pen) ;=> (:a :b :c :d :e)

我们真正想要的是查看"pen"中的{em>值中是否包含pen,如下所示:

(contains? (set (vals pen)) "pen") ;=> true

但这引出了一个问题:为什么不首先让pen成为一个集合?

(def pen #{"pen" "pe" "pem" "peng" "peny"})

(contains? pen "pen") ;=> true

答案 1 :(得分:1)

contains?检查密钥,而不是值。这是查看地图是否包含该值的一种方法:

(some #(= "pen" %)(vals peN))