2013-03-26 94 views
13

所以我習慣在我的應用程序中有一個嵌套的數組或地圖設置。我試圖設置一個像這樣的Clojure:Clojure得到嵌套的地圖值

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

我想知道你是否知道檢索嵌套值的好方法?我試圖寫

(:variations (:ground gridSettings)) 

哪個工作,但它是backwords和相當繁瑣,特別是如果我添加幾個級別。

+1

無論mtaka的和dbyrne的回答是解決這個問題的常用方法。使用任何打擊你的幻想!我會注意到,讓步讓你的意圖更清晰。 – WolfeFan 2013-03-26 14:37:19

+0

哇所有好的答案:)謝謝 – 2013-03-26 21:05:16

+1

我認爲是時候接受這些答案之一。我的心說* dbyrne *,但我的頭說* mtyaka * :) – joelittlejohn 2013-05-02 16:07:12

回答

25

這就是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. 
20

可以使用thread-first macro

(-> gridSettings :ground :variations) 

我寧願->get-in除了兩種特殊情況:

  • 當鍵是在運行時確定的任意序列。
  • 當提供未找到的值是有用的。
+0

如果'(:ground gridSettings)'爲零,結果如何? – arajek 2013-03-26 14:31:47

+2

整個表達式的結果將僅爲'nil'。不會拋出異常。 – dbyrne 2013-03-26 14:33:57

+0

'(:無零); =>無'。除非你故意需要別的東西,否則使用' - >'似乎也是慣用的Clojure。 – danneu 2013-03-26 16:49:38

9

除了其他什麼答案已經提到(get-in->宏),有時你想從地圖(嵌套與否)取多個值,在這些情況下,去結構化可以真正的幫助

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

地圖是部分功能(如未完成)。因此,人們可以簡單地將它們用作功能。根據問題的地圖:

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

結果是一張地圖。因此,它可以被再次應用,這將導致一個非常類似(但不是倒退),「語法」作爲問題提出:

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