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])

从文档字符串:

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)

除了两种特殊情况,->我更喜欢: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 回答