如何在Clojure中区分缺失键和值为nil的键?

Reb*_*bin 4 clojure

我们经常测试哈希映射是否存在某个键,例如:data,通过测试对该键的值的试验检索nil,如

(defn test-my-hash-map [my-hash-map]
  (if (:data my-hash-map) 42 "plugh!"))
Run Code Online (Sandbox Code Playgroud)

这会产生42任何包含:data具有任何值的键的哈希映射,除外nil.

(map test-my-hash-map
     [{:data "Hello!"}    ; ~~> 42
      {:no-data "Yikes!"} ; ~~> "plugh!"
      {:data nil}         ; ~~> "plugh!", but I need it to say 42 :(
     ])
Run Code Online (Sandbox Code Playgroud)

我根本没有看到任何办法,这就搞乱了一些数据处理场景,我们从非Clojure源获取数据,其中缺少的密钥意味着"我没有那个密钥的数据"和带有nil值的键意味着"我在那里有数据,但无论出于何种原因我都无法给你." 我没有看到在Clojure代码中区分这些情况的方法.我非常优雅的解决方法是在切换到Clojure之前插入一个检测差异的Java填充程序并为特殊情况插入额外的列(键).

Dan*_*zer 5

有一个clojure函数get允许提供默认值.

(:foo {:bar 1}) ; ==> nil
(get {:bar 1} :foo "no key inserted") ; ==> "no key inserted"
Run Code Online (Sandbox Code Playgroud)

当然还有contains?.

(contains? {:bar 1} :bar) ; ==> true
Run Code Online (Sandbox Code Playgroud)