如何判断Clojure哈希映射中某值是否存在且等于nil?
区分Clojure Map中键不存在与键值为nil的情况
在Clojure编程时,这两种场景用nil?判断会得到相同结果,很容易造成混淆:
(nil? (:potato {})) => true (nil? (:potato {:potato nil})) => true
你可以通过以下方式区分这两种情况:
方法1:用内置函数contains?判断键是否存在
contains?会直接检查map中是否包含指定键,和键值无关:
(contains? {} :potato) => false (contains? {:potato nil} :potato) => true
方法2:实现自定义的property-nil?函数
如果想要直接得到你需求中的判断结果,可以自己封装函数:
(defn property-nil? [m k] (and (contains? m k) (nil? (get m k))))
测试效果:
(property-nil? {} :potato) => false (property-nil? {:potato nil} :potato) => true
方法3:利用get的默认值区分
给get传入一个特殊的默认值(比如自定义的命名空间关键字),以此区分“键不存在”和“键值为nil”:
(let [val (get {} :potato ::not-found)] (= val ::not-found)) => true (let [val (get {:potato nil} :potato ::not-found)] (= val ::not-found)) => false
内容的提问来源于stack exchange,提问作者Terbiy
相关产品推荐
相关产品推荐

