The*_*au5 6 clojure clojurescript
我是Clojure的新手,我想知道是否有办法测试地图是否有多个键.我注意到contains?只检查一个键
我想做什么:
(def mario
{:position {:x 1 :y 2}
:velocity {:x 2 :y 0}
:mass 20})
;;Test if mario has a position and a velocity
(contains-many? mario :position :velocity) ;;true
;;Test if mario has a mass and a jump-height
(contains-many? mario :mass :jump-height) ;;false
Run Code Online (Sandbox Code Playgroud)
基本上,是否有像contains-many?clojure库中的函数,如果没有,你将如何实现该contains-many?功能?
小智 18
显示了正确的答案,但我想指出另一个优雅的解决方案,它可以提供有关地图值的知识.当你确定他们是真正的(即:不是nil和不false)时:
(every? m ks)
Run Code Online (Sandbox Code Playgroud)
这是因为map是(一元)函数,它们将相应的值返回给参数.但请注意({:x nil} :x) => nil.
我不知道那样做的任何功能.还需要定义您是希望地图包含每个键还是仅包含某些键.我选择的是每一个情况下,如果你想要的一些版本,只需更换every?用some?.
我的直接,未优化的版本是:
(defn contains-many? [m & ks]
(every? #(contains? m %) ks))
Run Code Online (Sandbox Code Playgroud)
已通过测试:
(deftest a-test
(testing "Basic test cases"
(let [m {:a 1 :b 1 :c 2}]
(is (contains-many? m :a))
(is (contains-many? m :a :b))
(is (contains-many? m :a :b :c))
(is (not (contains-many? m :a :d)))
(is (not (contains-many? m :a :b :d))))))
Run Code Online (Sandbox Code Playgroud)
编辑:使用noisesmith的建议简化
| 归档时间: |
|
| 查看次数: |
4718 次 |
| 最近记录: |