9

我正在尝试在不同的命名空间中定义一个动态变量。Lobos 文档指出:

默认情况下,所有迁移都保存在 lobos.migrations 命名空间中。它会通过迁移命令自动加载,因此无需自己加载。因此,要使用另一个命名空间,您必须更改 lobos.migration/ migrations-namespace动态变量。

我不知道如何在我的新命名空间中设置动态变量。

我可以通过 (ns `lobos.migration) 在 repl 中执行此操作,但从我自己的 ns 运行此 cmd

(def ^:dynamic lobos.migration/*migrations-namespace* 'gb.install.migrations)

产量Can't create defs outside of current ns

我怎样才能解决这个问题?

4

1 回答 1

20

Clojure 变量可以具有对所有线程可见的根绑定。此外,动态变量还可以具有每个线程的绑定,每个绑定仅对一个线程可见。

您可以使用以下方法为当前线程临时创建每个线程绑定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 的意愿设置 var。

于 2012-06-11T20:25:02.300 回答