我正在尝试从地图中找到匹配的键和值对。我正在使用以下代码:
(defn matches? [m k v]
(let [val (k m)]
(= val v)))
my-demo.core=> (matches? {:a 1 :b 2} :b 2)
true
my-demo.core=> (matches? {:a 1 :b 2} :b 3)
false
另一种使用方法superset?
:
my-demo.core=> (superset? #{:a 1 :b 3} #{:a 1})
true
my-demo.core=> (superset? #{:a 1 :b 3} #{:a 2})
false
我觉得有更好的方法可以做到这一点。
我的问题是:是否有一种惯用的方法在Clojure中的地图中找到匹配的键和值?
这可能是一个很小的问题,您可以只使用它而不是定义一个函数:
(= ({:a 1 :b 2} :a)
1)
=> true
我想说这是一种惯用的方式,对于大多数用例都可以正常工作。
但是,这取决于测试nil
值时所需的行为。因为上述方法将返回true
为:c nil
:
(= ({:a 1 :b 2} :c)
nil)
=> true
而且您的函数的行为方式相同:
(matches? {:a 1 :b 2} :c nil)
=> true
为了解决这个问题,您可以使用get
“未找到”值:
(= (get {:a 1 :b 2} :c ::not-found)
nil)
=> false
这可以正常工作,但可能不那么整洁。您只需要确保您的“未找到”值永远不会与测试值相同。
如果您想真正地知道一个映射包含一个可能带有nil
值的键,则您必须检查这两项。这是一个仅执行一次哈希映射查找就可以执行此操作的函数。它使用(find map key)
which返回键的映射条目(键-值对),如果键不存在,则返回nil。
(defn contains-kv? [m k v]
(if-let [kv (find m k)]
(= (val kv) v)
false))
(contains-kv? {:a 1 :b nil} :a 1)
=> true
(contains-kv? {:a 1 :b nil} :b nil)
=> true
(contains-kv? {:a 1 :b nil} :c nil)
=> false
注意:我不认为superset?
您在做您想做的事。在该示例中,您使用的是集合,而不是完全不同的哈希映射:
(clojure.set/superset? #{:a 1 :b 2} #{:a :b})
=> true
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句