Clojure获取嵌套映射值

Clojure获取嵌套映射值,clojure,Clojure,因此,我习惯于在应用程序中使用嵌套数组或设置映射。我试着在Clojure设置一个,如下所示: (def gridSettings {:width 50 :height 50 :ground {:variations 25} :water {:variations 25} }) 我想知道你是否知道检索嵌套值的好方法?我试着写作 (:variations (:ground gridSettings)) 这是可行的,但它的背景词和相当繁琐,特别是如果我添加了一些级别。这

因此,我习惯于在应用程序中使用嵌套数组或设置映射。我试着在Clojure设置一个,如下所示:

(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很难选择答案,因为它们都是正确的、有用的,我认为人们最好都阅读它们!