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

时间:2015-03-01 09:54:58

标签: clojure pretty-print datomic

在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}

为什么会有所不同?我错过了临时身份证的基本信息吗?

假设:

  • 以下是我在Leiningen的依赖:

    :dependencies [[org.clojure/clojure "1.6.0"] [com.datomic/datomic-free "0.9.5130"]]

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

1 个答案:

答案 0 :(得分:2)

看起来d/tempid会返回带有自定义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))会返回datomic.db.DbId这是一种自定义类型。