我们经常测试哈希映射是否存在某个键,例如: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填充程序并为特殊情况插入额外的列(键).
有一个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)