如何区分Clojure中缺少的键和值为零的键?
我们经常测试哈希映射是否存在某个键,例如如何区分Clojure中缺少的键和值为零的键?,clojure,Clojure,我们经常测试哈希映射是否存在某个键,例如:data,方法是根据nil测试该键的值的尝试检索,如 (defn test-my-hash-map [my-hash-map] (if (:data my-hash-map) 42 "plugh!")) 这将为包含键:data和任何值(值nil除外)的任何哈希映射生成42 (map test-my-hash-map [{:data "Hello!"} ; ~~> 42 {:no-data "Yikes!"} ; ~
:data
,方法是根据nil
测试该键的值的尝试检索,如
(defn test-my-hash-map [my-hash-map]
(if (:data my-hash-map) 42 "plugh!"))
这将为包含键:data
和任何值(值nil
除外)的任何哈希映射生成42
(map test-my-hash-map
[{:data "Hello!"} ; ~~> 42
{:no-data "Yikes!"} ; ~~> "plugh!"
{:data nil} ; ~~> "plugh!", but I need it to say 42 :(
])
我看不出有任何方法可以做到这一点,这会搞乱一些数据处理场景,我们从非克隆源获取数据,其中缺少的键表示“我在该键上没有数据”,而带有nil
值的键表示“我在那里有数据,但无论出于什么原因,我都不能给你。”我看不到在Clojure代码中区分这些情况的方法。
我的解决办法是插入一个Java垫片,用于检测差异,并在交给Clojure之前为特殊情况插入额外的列(键)。Clojure函数
get
允许提供默认值
(:foo {:bar 1}) ; ==> nil
(get {:bar 1} :foo "no key inserted") ; ==> "no key inserted"
当然还有包含?
(contains? {:bar 1} :bar) ; ==> true
如果您只想测试密钥是否存在,可以使用
contains?
:
(contains? {:a nil} :a) ; => true
(contains? {:a nil} :b) ; => false
在您的情况下,您可以使用get
提供默认值:
(get {:a 42} :a "foo!") ; => 42
(get {:a nil} :a "foo!") ; => nil
(get {:a 42} :b "foo!") ; => "foo!"
嗯,
(包含?我的哈希映射:数据)
有什么问题?包含
很好,因为代码读取(如果(包含?行:数据)…)