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



我们经常测试哈希映射是否存在某个键,比如: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!"

最新更新