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 - Fatal编程技术网

如何区分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!"

嗯,
(包含?我的哈希映射:数据)
有什么问题?
包含
很好,因为代码读取
(如果(包含?行:数据)…)