【问题标题】:var or ref/atom/agent for constant values?var 或 ref/atom/agent 用于常量值?
【发布时间】:2013-11-28 10:56:50
【问题描述】:

我想谦虚地问一下……

什么,“常量值的 var 或 ref/atom/agent?”,我要问吗? 当然,我确实将 vars 用于常量值。

但我一直想知道,当值的行为类似于常量但它们应该在运行时而不是在编译时(读取代码时)分配时,我应该使用哪一个。

例如,考虑一些写在用户配置文件中的 java 属性。 它们应该在运行时分配,因为数据不在代码中。 但是它们也应该在读取数据之前定义,因为其他代码引用它们。

在这种情况下,

什么时候使用'var's?:

  • 我定义了 'var's,或者只声明 'var's(如果可以的话)。
  • 然后我通过读取选项文件的函数再次重新定义那些 'var's。
  • 但是覆盖 'var' 感觉很糟糕,或者在函数内部定义 'var' 感觉很奇怪。

什么时候使用 ref/atom/agent?:

  • 我将 ref/atom/agents 分配给 'var's。
  • 然后我通过读取选项文件的函数更新这些 ref/atom/agents。
  • 但由于这些值在整个程序中使用,所以我担心它们的成本。
  • ...而且使用太多@宏有点烦人。

我不知道我应该使用什么。

在这些情况下你会使用什么?

'var's? '参考/原子/代理?甚至是“延迟”?

提前致谢。

【问题讨论】:

  • 为什么不在程序启动的第一行同步定义你的var?因此,在这种情况下,您不需要在其他地方覆盖该 var。另一方面,如果您在任何地方都写 @my-var 很烦人,您只需定义一个返回 @my-var 的包装函数
  • 感谢您的回答。如何同步定义我的 var?我不认为我明白你的意思。我认为 vars 不是同步的。您的意思是为 vars 分配 refs 并重置(更新) refs 以进行初始化吗?
  • 我的意思是在你的命名空间ns.with-const 中,第一行代码是(def my-const (some-computations))。因此,在此表达式评估所有尝试使用或要求 ns.with-const 的命名空间之前,不会开始评估他们自己的代码。这个模型没有竞争条件。当您的 const 将被计算 - 它变成定义的一切工作正常。希望这个解释有意义
  • 看起来是个聪明的主意——我应该试一试!也许它不能被预编译,但在大多数情况下它会有所帮助。谢谢!

标签: clojure var agent ref


【解决方案1】:

如果您正在学习的所有或一组“常量”可以在一个时间点学习,那么我们将它们称为“属性”。

让我们做一个“吸引他们”的配置:

(defn resource [path]
  (when path
    (-> (Thread/currentThread) .getContextClassLoader (.getResource path))))

(def props
  (edn/read-string 
    (slurp (io/file (resource (System/getProperty "your.conf"))))))

(defn conf [& path]                  ;; e.g. (conf :db :uri)
  (get-in props (vec path)))

您的属性(例如“常量”)文件“your.conf”将位于以下行中:

{:db
    {:uri "datomic:mem://dbname"
     :other-property 42}

 :rabbit
        {:host "192.168.1.17"
         :port 5672
         :exchange "xyz-exchange"
         :queue "zq"
         :exchange.type "direct"
         :vhost "/some-broker"
         :username "user"
         :password "strong"}}

然后稍后在您的程序/其他命名空间中,您可以访问所有这些属性:

(conf :db :uri)               ;; will "constant"ly return "datomic:mem://dbname"
(conf :rabbit :host)          ;; will "constant"ly return "192.168.1.17"
(conf :db :other-property)    ;; will "constant"ly return 42

在“现实生活”中,上面的“props”变量可能会检查“-D”路径,具有默认值并处理异常,但为了说明这一点,它有点简化。

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 2017-09-14
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多