Clojure 常量值的var或ref/atom/agent?
我想谦虚地问 问什么,“常量值的var或ref/atom/agent?”? 当然,我确实使用变量来表示常量值 但我一直想知道,如果值的行为类似于常量,但它们应该在运行时分配,而不是在编译时(当读取代码时)分配,我应该使用哪一个 例如,考虑一些写在用户配置文件中的java属性。 它们应该在运行时分配,因为数据不在代码中。 但它们也应该在读取数据之前定义,因为其他代码引用它们 在这种情况下, 何时使用“var”:Clojure 常量值的var或ref/atom/agent?,clojure,var,agent,ref,Clojure,Var,Agent,Ref,我想谦虚地问 问什么,“常量值的var或ref/atom/agent?”? 当然,我确实使用变量来表示常量值 但我一直想知道,如果值的行为类似于常量,但它们应该在运行时分配,而不是在编译时(当读取代码时)分配,我应该使用哪一个 例如,考虑一些写在用户配置文件中的java属性。 它们应该在运行时分配,因为数据不在代码中。 但它们也应该在读取数据之前定义,因为其他代码引用它们 在这种情况下, 何时使用“var”: 我定义“var”,或者只是声明“var”(如果可以的话) 然后我通过读取选项文件的函
- 我定义“var”,或者只是声明“var”(如果可以的话)
- 然后我通过读取选项文件的函数重新定义这些变量
- 但是覆盖“var”感觉很糟糕,或者在函数内部定义“var”感觉很奇怪
- 我将ref/atom/agents分配给“var”
- 然后我通过读取选项文件的函数更新这些ref/atom/agents
- 但是由于这些值在整个程序中都被使用,所以我担心它们的成本
- 。。。而且使用太多的@macros也有点烦人
{: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
在“现实生活”中,上面的“道具”变量可能会检查“-D”路径,具有默认值,并处理异常,但为了说明这一点,它有点简化。为什么不在程序启动时在第一行同步定义变量?因此,在这种情况下,您不需要在其他地方覆盖该var。另一方面,如果你在任何地方写
@my var
都很烦人,你可以定义一个包装函数,返回@my var
,谢谢你的回答。如何同步定义var?我想我不明白你的意思。我认为变量不是同步的。您的意思是将ref分配给vars并重置(更新)refs以进行初始化吗?我的意思是在您的命名空间ns处。使用常量,第一行代码将是(def my const(一些计算))
。因此,在这个表达式计算所有试图使用或需要ns的名称空间之前,with const
不会开始计算它们自己的代码。而且这个型号没有比赛条件。当你的常数被计算出来时,它就被定义了,一切都正常。希望这个解释能让senseLooks成为一个聪明的想法——我应该试一试!也许它不能预先编译,但在大多数情况下都会很有帮助。谢谢
(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