使用 Datomic 编码时 - 为什么 println 和 pprint 对临时 ID 的处理方式不同?

When coding with Datomic - why does println and pprint treat temporary ids differently?

在 Datomic 中,我可以获得如下临时 ID:

(ns demo
  (:require 
    [datomic.api :as d]
    [clojure.pprint :refer :all])))

(d/tempid :db.part/db)

现在,当您使用 println 输出此内容时,您会得到类似于:

的内容
(println (d/tempid :db.part/db))
;#db/id[:db.part/user -1000003]

现在我明白这是一个临时 ID。

然而,当我用漂亮的印刷品做同样的事情时 - 我得到了不同的东西:

(pprint (d/tempid :db.part/db))
;{:part :db.part/user, :idx -1000002}

为什么不同?我是否遗漏了有关临时 ID 的基本信息?

假设:

我的问题是:使用 Datomic 编码时 - 为什么 printlnpprint 对待临时 ID 的方式不同?

它看起来像 d/tempid returns 一条记录或一个具有自定义 toString 方法的对象。 println 打印带有名称的记录,而 pprint 将它们打印为普通地图。在 REPL 上试试这个:

user=> (defrecord MyRecord [a])
user.MyRecord
user=> (def m (My. 1))
#'user/m
user=> (println m)
#user.My{:a 1}
nil
user=> (clojure.pprint/pprint m)
{:a 1}
nil

#user.My{:a 1} 看起来并不完全像 #db/id[:db.part/user -1000003],但您可以看到使用 pprintprintln 来处理记录或其他对象之间的区别。

编辑:(type (d/tempid :db.part/user)) returns datomic.db.DbId 这是自定义类型。