以下是完全有效的 Clojure 代码:
(def a (atom nil))
(def b (atom a))
(reset! a b)
它在需要反向引用的情况下甚至很有用。
但是,在 REPL 中处理此类内容很烦人:每当您键入 a 或 b 时,REPL 都会尝试打印此类引用的内容,当然,很快就会生成堆栈溢出错误。
那么有什么办法可以控制/改变Clojure中atoms/refs/agents的打印行为吗?某种类型的循环检测会很好,但即使完全抑制取消引用的内容也非常有用。
最佳答案
你可以说
(remove-method print-method clojure.lang.IDeref)
从 print-method
中删除可取消引用对象(Atom、Refs 等)的特殊处理,使它们像这样打印:
user=> (atom 3)
#<Atom clojure.lang.Atom@5a7baa77>
或者,您可以添加更具体的方法来禁止打印某些特定引用类型的内容:
(defmethod print-method clojure.lang.Atom [a ^java.io.Writer w]
(.write w (str "#<" a ">")))
user=> (atom 3)
#<clojure.lang.Atom@4194e059>
关于clojure - 禁止打印 REPL 中原子保存的数据? (或引用人、代理人……),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417958/