(pr +)
;=> #object[clojure.core$_PLUS_ 0x4e648e99 "clojure.core$_PLUS_@4e648e99"]
对于更复杂的例子,这似乎是一致的模式:
#object[namespace$symbol addr "namespace$symbol@addr"]
这里第三个元素的目的是什么?什么时候不遵循这种模式?
答案 0 :(得分:5)
此特定格式由clojure.core/print-tagged-object
函数(私有到clojure.core
)生成,clojure.core/print-method
的某些实现委托给它。 print-method
的其他实现不使用print-tagged-object
并生成不同的表示 - 例如Clojure的内置数据结构往往可以表示为Clojure文字。
向量的元素表示以下内容:
第一个元素是对象的类。
Clojure函数是类的实例,其名称来源于它们在其中定义的名称空间:
(class +)
;= clojure.core$_PLUS_
第二个元素是由
确定的对象的标识哈希码(System/identityHashCode x)
最后一个元素是在与对象关联的辅助值上调用print-method
的结果,对于使用#object[…]
表示的对象,该元素将倾向于归结为{{1调用,虽然有一些例外:
toString
此特定行为由实现中的此片段解释:
(prn (atom {}))
;; #object[clojure.lang.Atom 0x565f390 {:status :ready, :val {}}]
(str (atom {}))
;= "clojure.lang.Atom@311bf055"
;; /src/clj/clojure/core_print.clj L410-411 (as of right now)
(defmethod print-method clojure.lang.IDeref [o ^Writer w]
(print-tagged-object o (deref-as-map o) w))
来自{:status :ready, :val {}}
电话; deref-as-map
在上面定义。
有关详细信息,请参阅/src/clj/clojure/core_print.clj
的其余部分(链接到主分支的当前提示)。