【问题标题】:Clojure get nested map valueClojure 获取嵌套映射值
【发布时间】:2013-03-26 14:03:57
【问题描述】:

所以我习惯于在我的应用程序中使用嵌套数组或设置映射。我尝试像这样在 Clojure 中设置一个:

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

我想知道您是否知道检索嵌套值的好方法?我试着写了

(:variations (:ground gridSettings))

这行得通,但它是背单词而且相当麻烦,特别是如果我添加几个级别。

【问题讨论】:

  • mtaka 和 dbyrne 的答案都是解决此问题的常用方法。使用任何你喜欢的!我会注意到,进入会让你的意图更清晰。
  • 哇所有的好答案:) 谢谢
  • 我认为是时候接受这些答案之一了。我的心说dbyrne,但我的头却说mtyaka :)
  • @joelittlejohn 很难选择一个答案,因为它们都很好而且很有用,我认为最好通过阅读它们来为人们服务!

标签: clojure


【解决方案1】:

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.

【讨论】:

    【解决方案2】:

    您可以使用thread-first macro:

    (-> gridSettings :ground :variations)
    

    我更喜欢-> 而不是get-in,除了两种特殊情况:

    • 当键是在运行时确定的任意序列时。
    • 在提供未找到的值时很有用。

    【讨论】:

    • (:ground gridSettings) 为 nil 会是什么结果?
    • 整个表达式的结果就是nil。不会抛出异常。
    • (:ground nil) ;=> nil。除非您故意需要其他东西,否则使用 -> 似乎也是惯用的 Clojure。
    • 但是-> 可以与or 一起使用,也可以很好地返回一个未找到的值。 (get-in grid-settings [:ground :variations] "not found!")(-> grid-settings :ground :variations (or "not found!"))
    • 当您需要非关键字的谓词时,也可以使用 ->,即在导航路径上查找下一步需要调用函数时。
    【解决方案3】:

    除了其他答案提到的(get-in-> 宏)之外,有时您想从映射中获取多个值(是否嵌套),在这些情况下,解构可能非常有用

    (let [{{gv :variations} :ground
           {wv :variations} :water} gridSettings]
      [gv wv]) 
    

    【讨论】:

      【解决方案4】:

      地图是部分函数(不是全部)。因此,可以简单地将它们作为函数应用。根据问题的地图:

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

      结果是一张地图。因此,它可以再次应用,这会导致问题中提出的非常相似(但不是向后)的“语法”:

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

      【讨论】:

        猜你喜欢
        • 2016-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        相关资源
        最近更新 更多