我们经常测试哈希映射是否存在某个键,比如:data
,通过测试该键值的nil
的试验检索,如
(defn test-my-hash-map [my-hash-map]
(if (:data my-hash-map) 42 "plugh!"))
这将为包含键:data
的任何哈希映射生成42
,该哈希映射具有任何值,值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 代码中区分这些情况的方法。我非常棘手的解决方法是插入一个 Java 填充程序,该填充程序可以检测差异并为特殊情况插入额外的列(键),然后再交给 Clojure。
有一个 clojure 函数get
允许提供默认值。
(:foo {:bar 1}) ; ==> nil
(get {:bar 1} :foo "no key inserted") ; ==> "no key inserted"
当然还有contains?
.
(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!"