(原始对象)中有哪些不同的部分?

时间:2015-10-17 18:17:21

标签: debugging clojure

(pr +)
;=> #object[clojure.core$_PLUS_ 0x4e648e99 "clojure.core$_PLUS_@4e648e99"]

对于更复杂的例子,这似乎是一致的模式:

#object[namespace$symbol addr "namespace$symbol@addr"]

这里第三个元素的目的是什么?什么时候不遵循这种模式?

1 个答案:

答案 0 :(得分:5)

此特定格式由clojure.core/print-tagged-object函数(私有到clojure.core)生成,clojure.core/print-method的某些实现委托给它。 print-method的其他实现不使用print-tagged-object并生成不同的表示 - 例如Clojure的内置数据结构往往可以表示为Clojure文字。

向量的元素表示以下内容:

  1. 第一个元素是对象的类。

    Clojure函数是类的实例,其名称来源于它们在其中定义的名称空间:

    (class +)
    ;= clojure.core$_PLUS_
    
  2. 第二个元素是由

    确定的对象的标识哈希码
    (System/identityHashCode x)
    
  3. 最后一个元素是在与对象关联的辅助值上调用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在上面定义。

  4. 有关详细信息,请参阅/src/clj/clojure/core_print.clj的其余部分(链接到主分支的当前提示)。