声明地图时避免重复
avoiding repetion while declaring maps
我正在使用 environ 设置配置映射以获取环境变量。由于 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)})
有没有办法防止这种重复?也许是接收关键字和 returns 地图的某种键值对的函数?
这是一种通过定义辅助函数来实现的方法:
(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}
请注意,出于测试目的,我使用了一个技巧并将 map env
替换为 函数 env
来自 environ
库。这是可行的,因为映射在查找其键时可以像函数一样工作。它仍然适用于像 environ.core/env
.
这样的实际函数
如评论中所述,由于 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]))
如果您有任意函数而不是特定的地图,Alan Thompson 的方法是合理的。
我正在使用 environ 设置配置映射以获取环境变量。由于 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)})
有没有办法防止这种重复?也许是接收关键字和 returns 地图的某种键值对的函数?
这是一种通过定义辅助函数来实现的方法:
(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}
请注意,出于测试目的,我使用了一个技巧并将 map env
替换为 函数 env
来自 environ
库。这是可行的,因为映射在查找其键时可以像函数一样工作。它仍然适用于像 environ.core/env
.
如评论中所述,由于 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]))
如果您有任意函数而不是特定的地图,Alan Thompson 的方法是合理的。