Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 查找地图是否包含多个键_Clojure_Clojurescript - Fatal编程技术网

Clojure 查找地图是否包含多个键

Clojure 查找地图是否包含多个键,clojure,clojurescript,Clojure,Clojurescript,我是Clojure的新手,我想知道是否有办法测试地图是否有多个键。我注意到包含?只检查一个键 我想做的是: (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

我是Clojure的新手,我想知道是否有办法测试地图是否有多个键。我注意到
包含?
只检查一个键

我想做的是:

(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

基本上,clojure库中是否有像
包含多个?
这样的函数,如果没有,您将如何实现
包含多个?
函数?

我不知道有任何函数可以实现这一点。还需要定义是希望贴图包含每个键还是仅包含一些键。我选择了every case,如果您想要某个版本,只需将
every?
替换为
some?

我的直接(未优化)版本是:

(defn包含许多?[m&K]
(每?#(含?m%)ks)
已通过以下测试:

(deftest a-test
(测试“基本测试用例”
(设[m{:A1:B1:C2}]
(is(包含多个?m:a))
(is(包含许多?m:a:b))
(is(包含许多?m:a:b:c))
(是(不是(包含许多?m:a:d)))
(是(不是(包含很多?m:a:b:d()()))))

编辑:使用noisesmith的建议简化显示了正确答案,但我想指出另一个优雅的解决方案,该解决方案假定了解地图值。当您确定它们是真实的(即:not
nil
和not
false
):


这是因为映射是(一元)函数,它将相应的值返回给参数。但是请注意,
({:x nil}:x)=>nil

这里有另一个使用
clojure.set
的解决方案,它适用于非真实值:

(require '[clojure.set :as set])

(defn contains-many? [m & ks]
  (empty? (set/difference (set ks) (set (keys m)))))
你可以利用

(clojure.set/subset?
#{:位置:速度}
(设置(马里奥键)))

酷!谢谢是的,我想让这个函数测试地图是否有每个键。谢谢快速提问:这是什么语法:
#(包含?m%)
这是像咖喱还是模式匹配之类的吗?这是创建一个参数的匿名函数(用%表示)的语法糖。它相当于
(fn[k](包含?mk))
。酷!谢谢我懂了。语法糖确实使它更简洁易读。更简单的版本:
(每个?#(包含?m%)ks)
映射是函数?!哇!嗯,我可以肯定地知道我的值不是
nil
,但它们可以是
false
。所以,我不认为这次我可以使用这个技巧,但我一定会记住它的未来,谢谢!嘿@Thesemau5我想这应该是公认的答案:)
(require '[clojure.set :as set])

(defn contains-many? [m & ks]
  (empty? (set/difference (set ks) (set (keys m)))))