Clojure获取嵌套映射值
因此,我习惯于在应用程序中使用嵌套数组或设置映射。我试着在Clojure设置一个,如下所示:Clojure获取嵌套映射值,clojure,Clojure,因此,我习惯于在应用程序中使用嵌套数组或设置映射。我试着在Clojure设置一个,如下所示: (def gridSettings {:width 50 :height 50 :ground {:variations 25} :water {:variations 25} }) 我想知道你是否知道检索嵌套值的好方法?我试着写作 (:variations (:ground gridSettings)) 这是可行的,但它的背景词和相当繁琐,特别是如果我添加了一些级别。这
(def gridSettings
{:width 50
:height 50
:ground {:variations 25}
:water {:variations 25}
})
我想知道你是否知道检索嵌套值的好方法?我试着写作
(:variations (:ground gridSettings))
这是可行的,但它的背景词和相当繁琐,特别是如果我添加了一些级别。这就是
进入的功能:
(get-in gridSettings [:ground :variations])
从文档字符串:
您可以使用:
我更喜欢->
而不是上车
,除了两种特殊情况:
- 当键是运行时确定的任意序列时
- 提供未找到的值时非常有用
除了其他答案所提到的(get in
和->
宏),有时您需要从映射中获取多个值(嵌套或非嵌套),在这些情况下,结构化非常有用
(let [{{gv :variations} :ground
{wv :variations} :water} gridSettings]
[gv wv])
映射是部分函数(不是全部)。因此,可以简单地将它们作为函数应用。根据问题的地图:
(gridSettings :ground)
;=> {:variations 25}
((gridSettings :ground) :variations)
;=>25
结果是一张地图。因此,它可以再次应用,从而产生与问题中提出的非常相似(但不是向后)“语法”:
(gridSettings :ground)
;=> {:variations 25}
((gridSettings :ground) :variations)
;=>25
如果(:ground gridSettings)
为nil,结果会是什么?整个表达式的结果将仅为nil
。不会引发异常。(:ground nil);=>无
。除非您有意需要其他东西,否则使用->
似乎也是惯用的Clojure。但是->
可以与或一起使用,也可以很好地返回未找到的值(进入网格设置[:ground:variations]“找不到!”)
vs.(->网格设置:ground:variations(或“找不到!”)
当您需要非关键字的谓词时,也可以使用->,例如,在导航路径上查找下一步时,需要调用函数。mtaka和dbyrne的答案都是解决此问题的常用方法。随便用你喜欢的吧!我想说的是,加入会让你的意图更加清晰。哇,所有的好答案:)谢谢,我想是时候接受其中一个答案了。我的心在说dbyrne,但我的头在说mtyaka:)@joelitletlejohn很难选择答案,因为它们都是正确的、有用的,我认为人们最好都阅读它们!