4

特定のキーの存在についてハッシュマップをテストすることがよくあり:dataますnil

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

これは、値を除く任意の値を持つ42キーを含むハッシュマップを生成します。:datanil

(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 shim を挿入することです。

4

2 に答える 2

5

getデフォルト値を指定できるようにするclojure 関数があります。

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

ももちろんありcontains?ます。

(contains? {:bar 1} :bar) ; ==> true
于 2013-09-21T01:14:59.583 に答える
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!"
于 2013-09-21T01:16:18.960 に答える