我有两个命名空间:第一个是 clojuresque java 中的 gui,第二个是常规 clojure。用户在 gui 中输入值;这些需要在非gui ns中“传递”到“设置”值。我读过在 defn 中使用 def 是不好的做法,即使它有效。在我寻找解决这个小问题的过程中,我找到了实习生函数。实习生是一个可接受的解决方案还是我应该使用其他东西?
问问题
294 次
2 回答
0
请使用 atom,官方文档:http: //clojure.org/atoms
于 2013-03-14T10:18:09.767 回答
0
是的,正如另一个答案指出的那样,原子是保持可变状态的最佳选择。
创建一个原子,如:
(def my-state (atom 1)) (取消引用我的状态) => 1 ;; @ 扩展为 deref 调用 @我的状态 => 1
现在可以使用交换更新它:
(交换!我的状态(fn [旧值] 2) @我的状态 => 2
您可以在可从 Java 调用的命名空间中使用它:
(ns foo.NonGUI (:gen-class :name foo.NonGUI :methods [#^{:static true} [setMyState [int] int]])) (定义我的状态(原子)) (定义-setMyState “将我的状态设置为新值” [新价值] (交换!我的状态(fn [旧值] 新值))
在编译它并在 java 类路径上获取编译后的类文件之后,您应该能够从 Java 中使用这个命名空间:
导入 foo.NonGUI; 公共类主要{ 公共静态无效主要(字符串[]参数){ NonGUI.setMyState(4); } }
有关Java 互操作的更多信息,请参阅从 java 调用 clojure 。
于 2013-03-14T15:09:14.773 回答