{{pr}} 错误地表示了一个包含命名空间键的 structmap。{{pr}} 错误地显示实际键的值,并包括幽灵键。
user> (pr-str (struct (create-struct :q/a :q/b :q/c) 1 2 3))
"#:q{:q/a nil, :q/b nil, :q/c nil, :c 3, :b 2, :a 1}"
这在 Clojure 1.8 中工作得很好,并且禁用 print-namespace-maps 功能似乎可以解决这个问题。
user> (binding [*print-namespace-maps* false]
(pr-str (struct (create-struct :q/a :q/b :q/c) 1 2 3)))
"{:q/a 1, :q/b 2, :q/c 3}"
顺便说一句:Structmaps(仍然是现在)在基础是匿名和计算(而不是编码)时或当键顺序是基础的重要方面时是适当的。人们有时引用参考文档中的声明,“大多数 StructMaps 的用途现在可能由记录更好地服务”,但当然,它只涉及那些实际上由记录更好地服务的用途。记录类不能是匿名的,defrecord 需要在编译时指定基础;而普通映射不是预定义的键顺序。因此,structmaps 的持续相关性。