可能很明显,但是给出下面的代码(来自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,如果有帮助的话。谢谢!
发布于 2012-04-17 04:08:12
您的基本问题是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))(我只在vanilla Clojure中测试过这一点,但我认为在ClojureCLR中也是如此。)
不过,在这一点上,您最好创建一个实际的类型,而不是具体化,因为您每次都要重新定义方法。(我想您可以做一些全局状态来避免这种必要性,但是…(好吧,您可以理解为什么定义类型可能更好。)
https://stackoverflow.com/questions/10179780
复制相似问题