2016-12-28 50 views
0

我設置配置地圖使用environ獲取env變量。由於ENVIRON標準化大寫字母爲小寫字母和「_」字符爲「 - 」,我結束了關鍵字避免重寫,同時聲明地圖

(def config {:consumer-key (env :consumer-key) 
      :keystore-password (env :consumer-key) 
      :ssl-keystore-password (env :ssl-keystore-password) 
      :ssl-certificate-name (env :ssl-certificate-name) 
      :callback-url (env :callback-url) 
      :mp-private-key (env :mp-private-key) 
      :merchant-checkout-id (env :merchant-checkout-id) 
      :is-sandbox (env :is-sandbox)}) 

的重複是有辦法避免這種重複?也許是一個接收關鍵字並返回地圖的某種鍵值對的函數?

+3

您可以使用['select-keys'](http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/select-keys)來創建'config'映射嗎? – glts

回答

3

正如在評論中提到的,因爲env是一個地圖,你可以只使用select-keys與鍵列表複製:

(def config 
    (select-keys env [:consumer-key :is-sandbox 
        :keystore-password :ssl-keystore-password :ssl-certificate-name 
        :callback-url :mp-private-key :merchant-checkout-id])) 

阿蘭·湯普森的做法是合理的,如果你有一個任意函數,而不是具體地地圖。

+0

因爲他使用'environ'庫,那麼'env'確實是一個函數:https://github.com/weavejester/environ#usage –

+0

如果我沒有記錯,它真的是一張地圖。 「讓我們從environ.core/env映射關鍵字:database-url中提取數據庫連接詳細信息。」 (來自docs)..所以@ amalloy的回答應該是正確的 – leetwinski

+0

這絕對是一張地圖:https://github.com/weavejester/environ/blob/master/environ/src/environ/core.clj#L39 – amalloy

0

這是通過定義一個輔助函數來做到這一點的一種方式:即用於測試目的我用一招和取代的地圖env功能env

(def env {:consumer-key 1 
      :ssl-key  2 
      :mp-private-key 3}) 

(def key-list (keys env)) 

(defn extract-from 
    [src-fn keys] 
    (into (sorted-map) 
    (for [key keys] 
     {key (src-fn key)}))) 

(println "result:" (extract-from env key-list)) 

=> result: {:consumer-key 1, :mp-private-key 3, :ssl-key 2} 

注從environ庫。這可以起作用,因爲地圖在查看按鍵時可以像一個函數一樣工作。它仍然適用於像environ.core/env這樣的實際功能。