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)})

有没有办法防止这种重复?也许是一个接收关键字并为地图返回某种键值对的函数?

4

2 回答 2

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]))

如果您有一个任意函数而不是专门的地图,那么 Alan Thompson 的方法是合理的。

于 2016-12-28T23:14:00.470 回答
0

这是通过定义辅助函数来实现的一种方法:

(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 envenvironenviron.core/env

于 2016-12-28T19:35:32.903 回答