2016-12-28 115 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这样的实际功能。