可能很明显,但给定以下代码(来自 http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify):
(defn reify-str []
(let [f "foo"]
(reify Object
(ToString [this] f))))
(defn -main [& args]
(println (reify-str))
(System.Console/ReadLine))
为什么我会收到此输出?
#<ui$reify_str$reify__4722__4727 foo>
而不是:
foo
我正在Windows中运行ClojureCLR,如果它有帮助的话。谢谢!
你的基本问题是 Clojure REPL 使用 print-method
,而不是.toString
。您必须为您的类型定义print-method
。对于化类型来说有点烦人,因为它使它们有点冗长。你必须做这样的事情:
(defn reify-str []
(let [f "foo"
r (reify Object
(ToString [this] f))]
(defmethod clojure.core/print-method (type r) [this writer]
(print-simple f writer))
r))
(我只在原版 Clojure 中测试过这个,但我认为在 ClojureCLR 中是一样的。
但是,此时,最好创建一个实际类型而不是具体化,因为每次都要重新定义方法。(我想你可以做某种全局状态来避免这种必要性,但是......好吧,您可以理解为什么定义类型可能更可取。