首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reify,ToString

reify,ToString
EN

Stack Overflow用户
提问于 2012-04-17 02:44:30
回答 1查看 917关注 0票数 3

可能很明显,但是给出下面的代码(来自http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify):

代码语言:javascript
复制
(defn reify-str []
  (let [f "foo"]
    (reify Object
      (ToString [this] f))))

(defn -main [& args]
  (println (reify-str))
  (System.Console/ReadLine))

为什么我会得到这个输出?

代码语言:javascript
复制
#<ui$reify_str$reify__4722__4727 foo>

而不是:

代码语言:javascript
复制
foo

我在Windows中运行ClojureCLR,如果有帮助的话。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-17 04:08:12

您的基本问题是Clojure REPL使用print-method,而不是.toString。您必须为您的类型定义print-method。对于具体化的类型来说,这有点麻烦,因为这会让它们变得有点冗长。你必须这样做:

代码语言:javascript
复制
(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中也是如此。)

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10179780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档