reify,ToString

时间:2012-04-16 18:44:30

标签: clojure clojureclr

可能很明显,但鉴于此代码(来自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,如果有帮助的话。谢谢!

1 个答案:

答案 0 :(得分:5)

您的基本问题是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中是相同的。)

但是,在这一点上,你最好创建一个实际类型而不是reifying,因为你每次都在重新定义方法。 (我想你可以做某种全局状态来避免必要性,但是......好吧,你可以看到为什么定义一个类型可能更好。)