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

时间:2013-09-21 01:10:11

标签: clojure

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

(defn test-my-hash-map [my-hash-map]
  (if (:data my-hash-map) 42 "plugh!"))

这会为包含任意值的键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 :(
     ])

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

2 个答案:

答案 0 :(得分:5)

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

(:foo {:bar 1}) ; ==> nil
(get {:bar 1} :foo "no key inserted") ; ==> "no key inserted"

当然还有contains?

(contains? {:bar 1} :bar) ; ==> true

答案 1 :(得分:2)

如果您只想测试是否存在密钥,可以使用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!"