gpt4 book ai didi

clojure - 具体化,ToString

转载 作者:行者123 更新时间:2023-12-01 08:17:01 27 4
gpt4 key购买 nike

可能很明显,但给出这段代码(来自 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))

(我只在 vanilla Clojure 中测试过这个,但我认为它在 ClojureCLR 中是一样的。)

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

关于clojure - 具体化,ToString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10179780/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com