我们经常通过测试针对: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填充程序并为特殊情况插入额外的列(键)。
答案 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!"