Clojure 声明映射时避免重复
我正在使用设置配置映射来获取环境变量。由于environ将大写字母规范化为小写字母,将“u”字符规范化为“-”,因此我最终重复了关键字Clojure 声明映射时避免重复,clojure,environ,Clojure,Environ,我正在使用设置配置映射来获取环境变量。由于environ将大写字母规范化为小写字母,将“u”字符规范化为“-”,因此我最终重复了关键字 (def config {:consumer-key (env :consumer-key) :keystore-password (env :consumer-key) :ssl-keystore-password (env :ssl-keystore-password) :ssl-
(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)})
有没有办法防止这种重复?可能是一个函数,它接收关键字并为映射返回某种类型的键值对?这里有一种方法可以通过定义辅助函数来实现:
(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}
请注意,出于测试目的,我使用了一个技巧,用映射
env
替换库中的函数env
。这是因为地图在查找其关键点时可以像函数一样工作。它仍然适用于实际函数,如environ.core/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}
请注意,出于测试目的,我使用了一个技巧,用映射env
替换库中的函数env
。这是因为地图在查找其关键点时可以像函数一样工作。它仍然适用于注释中提到的实际功能,如environ.core/env
,因为env
是一个映射,您只需使用选择键
和要复制的键列表即可:
(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)的方法是合理的,如果你有一个任意函数,而不是一个特定的映射。如评论中所述,因为env
是一个映射,你可以使用选择键
和一系列要复制的键:
(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)的方法是合理的,如果你有一个任意函数,而不是一个特定的映射。你能用它来创建config
map吗?你能用它来创建config
map吗?因为他使用的是environ
库,那么env
确实是一个函数:如果我没记错的话,这真是一张地图。“让我们从environ.core/env映射上的key:database url中提取数据库连接详细信息。”(来自文档)。。所以@amalloy的答案应该是正确的,这绝对是一张地图:因为他使用的是environ
库,那么env
确实是一个函数:如果我没记错的话,它确实是一张地图。“让我们从environ.core/env映射上的key:database url中提取数据库连接详细信息。”(来自文档)。。所以@amalloy的答案应该是正确的这绝对是一张地图: