18

そのため、アプリケーションでネストされた配列または設定のマップを使用することに慣れています。次のようにClojureで設定してみました:

(def gridSettings
  {:width 50
   :height 50
   :ground {:variations 25}
   :water {:variations 25}
   })

そして、ネストされた値を取得する良い方法を知っているかどうか疑問に思いましたか? 書いてみた

(:variations (:ground gridSettings))

これは機能しますが、特にいくつかのレベルを追加する場合は、バックワードであり、かなり面倒です。

4

4 に答える 4

36

それが何をするかget-inです:

(get-in gridSettings [:ground :variations])

docstring から:

clojure.core/get-in
([m ks] [m ks not-found])
  Returns the value in a nested associative structure,
  where ks is a sequence of keys. Returns nil if the key
  is not present, or the not-found value if supplied.
于 2013-03-26T14:06:06.137 に答える
29

スレッド優先マクロを使用できます:

(-> gridSettings :ground :variations)

->2 つの特殊なケースをget-in除いて、私はよりも好きです。

  • キーが実行時に決定される任意のシーケンスである場合。
  • 見つからない値を指定すると便利です。
于 2013-03-26T14:21:40.970 に答える
12

get-in他の回答が言及したもの(およびマクロ)とは別に->、マップから複数の値を取得したい場合があります(ネストされているかどうかにかかわらず)。そのような場合、構造化解除が非常に役立ちます

(let [{{gv :variations} :ground
       {wv :variations} :water} gridSettings]
  [gv wv]) 
于 2013-03-26T15:37:30.437 に答える
3

マップは部分関数です (合計ではありません)。したがって、それらを関数として簡単に適用できます。質問の地図に基づいて:

(gridSettings :ground)
;=> {:variations 25}

その結果が地図です。そのため、再度適用すると、質問で提案されているように、非常によく似た (ただし逆ではない) 「構文」が得られます。

((gridSettings :ground) :variations)
;=>25 
于 2017-07-24T12:51:23.230 に答える