参考官方文档:http://clojure.org/data_structures
很多自定义的map拥有部分或者全部相同的keys,将这些相同的keys抽出来定义成StructMap类型,可以提升性能,节省内存。
下面这篇中文文档写的非常好,推荐,我的例子来自于它:
http://xumingming.sinaapp.com/302/clojure-functional-programming-for-the-jvm-clojure-tutorial/#struct-maps
英文原版是最新的,参考:http://java.ociweb.com/mark/clojure/article.html
defstruct宏内部实现使用了create-struct函数。现在通过REPL会话创建一个类型:
user=> (defstruct vehicle-struct :make :model :year :color) #'user/vehicle-struct创建成功,默认在'user namespace下创建了一个名叫vehicle-struct的类型,拥有四个key.
现在实例化一个对象:
(def vehicle (struct vehicle-struct "Toyota" "Prius" 2009))def语句是创建变量的意思,并设置初始值。
struct函数创建了一个vehicle-struct对象,构造函数接受三个参数,注意参数顺序要按照类型定义的key顺序来传递。
user=> (println vehicle) {:make Toyota, :model Prius, :year 2009, :color nil}打印一下,可以看到:color key的值没有设置。
现在使用正常的hash map的方法访问key :year
user=> (:year vehicle) 2009 user=> (vehicle :year) 2009两种都可以。但是这两种方法访问较慢。可以提供一个get方法直接访问,而无需按照HashMap的方式计算hash code来查找。
user=> (def year (accessor vehicle-struct :year)) #'user/year这里定义了一个year,实际上指向(accessor ...) list
user=> (year vehicle) 2009运行这个year表达式,vehicle的:year对应的值被返回。