【问题标题】:reify, ToString物化,ToString
【发布时间】:2012-04-17 04:20:56
【问题描述】:

可能很明显,但鉴于此代码(来自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 clojureclr


【解决方案1】:

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

不过,此时您最好创建一个实际类型而不是具体化,因为您每次都在重新定义方法。 (我想你可以做一些全局状态来避免这种必要性,但是……好吧,你可以明白为什么定义一个类型可能更可取。)

【讨论】:

  • 确实有效,刚刚测试过。顺便说一句,我在上面粘贴的 sn-p 也是如此,if 我将它包装在对 (str ...) 的调用中(我猜它调用了 ToString 方法,而 println 调用了 print-method)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2018-01-18
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多