在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进行编码时 - 为什么println
和pprint
对临时ID的处理方式不同?
答案 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]
完全不同,但您可以看到对记录或其他对象等内容使用pprint
和println
之间的区别。
修改:(type (d/tempid :db.part/user))
会返回datomic.db.DbId
这是一种自定义类型。