Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 声明映射时避免重复_Clojure_Environ - Fatal编程技术网

Clojure 声明映射时避免重复

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-

我正在使用设置配置映射来获取环境变量。由于environ将大写字母规范化为小写字母,将“u”字符规范化为“-”,因此我最终重复了关键字

(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的答案应该是正确的这绝对是一张地图: