我不确定我在这里做错了什么:
(defstruct prefix :a :b :c :d :e)
(def peN (struct prefix "pen" "pe" "pem" "peng" "peny"))
(contains? peN "pen") ;=> false
我希望它能回归真实。也许我没有使用包含?是否正确?
答案 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))