所以我习惯在我的应用程序中使用嵌套数组或设置图。我尝试在Clojure中设置一个像这样:
(def gridSettings
{:width 50
:height 50
:ground {:variations 25}
:water {:variations 25}
})
我想知道你是否知道检索嵌套值的好方法?我试着写
(:variations (:ground gridSettings))
哪个有效,但它是后缀而且相当繁琐,特别是如果我添加几个级别。
答案 0 :(得分:26)
这就是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.
答案 1 :(得分:21)
您可以使用thread-first macro:
(-> gridSettings :ground :variations)
我更喜欢->
而不是get-in
,除了两个特殊情况:
答案 2 :(得分:11)
除了其他答案(get-in
和->
宏)之外,有时你想从地图中获取多个值(嵌套或不嵌套),在这种情况下,解构可能真的有帮助
(let [{{gv :variations} :ground
{wv :variations} :water} gridSettings]
[gv wv])
答案 3 :(得分:0)
地图是部分功能(不是全部)。因此,人们可以简单地将它们作为函数应用。基于问题的地图:
(gridSettings :ground)
;=> {:variations 25}
结果是地图。因此,它可以再次应用,这导致非常相似(但不是向后)的语法"正如问题中提出的那样:
((gridSettings :ground) :variations)
;=>25