我正在尝试在不同的命名空间中定义动态var。 Lobos文档说明:
默认情况下,所有迁移都保存在lobos.migrations命名空间中。 它会被迁移命令自动加载,所以没有 需要自己加载它。因此,要使用另一个名称空间 更改lobos.migration / 迁移命名空间动态变量。
我无法弄清楚如何在我的新命名空间中设置动态变量。
我可以在repl via(ns`lobos.migration)中执行此操作,但是从我自己的ns中运行此cmd
(def ^:dynamic lobos.migration/*migrations-namespace* 'gb.install.migrations)
收益Can't create defs outside of current ns
。
我该如何解决这个问题?
答案 0 :(得分:19)
Clojure vars可以拥有一个对所有线程都可见的根绑定。此外,动态变量也可以具有每个线程绑定,每个绑定只对一个线程可见。
您可以使用binding
:
(binding [lobos.migration/*migrations-namespace* 'gb.install.migrations]
;; binding is in effect here in the body of the binding form
)
或者如果每个线程绑定已经生效,您可以使用set!
更改其值:
(set! lobos.migration/*migrations-namespace* 'gb.install.migrations)
但是,您可能需要以所有线程中可见的方式更改此特定动态变量。如果是这样,您需要通过执行以下操作来更改其根绑定:
(alter-var-root #'lobos.migration/*migrations-namespace*
(constantly 'gb.install.migrations))
注意我对lobos本身一无所知,所以不能肯定地说这些中的任何一个实际上都会以lobos的方式设置变量。