StructMap

StructMap和普通的map类似,它的作用其实是用来模拟java里面的javabean, 所以它比普通的map的优点就是,它把一些常用的字段抽象到一个map里面去,这样你就不用一遍一遍的重复了。并且和java类似,他会帮你生成合适的 equalshashCode 方法。并且它还提供方式让你可以创建比普通map里面的hash查找要快的字段访问方法(javabean里面的getXXX方法)。

create-struct 函数 和 defstruct 宏都可以用来定义StructMap, defstruct内部调用的也是 create-struct 。map的key通常都是用keyword来指定的。看例子:

(def vehicle-struct (create-struct :make :model :year :color)) ; long way
(defstruct vehicle-struct :make :model :year :color) ; short way

struct 实例化StructMap的一个对象,相当于java里面的new关键字. 你提供给struct的参数的顺序必须和你定义的时候提供的keyword的顺序一致,后面的参数可以忽略, 如果忽略,那么对应key的值就是nil。看例子:

(def vehicle (struct vehicle-struct "Toyota" "Prius" 2009))

accessor 函数可以创建一个类似java里面的getXXX的方法, 它的好处是可以避免hash查找, 它比普通的hash查找要快。看例子:

; Note the use of def instead of defn because accessor returns
; a function that is then bound to "make".
(def make (accessor vehicle-struct :make))
(make vehicle) ; -> "Toyota"
(vehicle :make) ; same but slower
(:make vehicle) ; same but slower

在创建一个StructMap之后, 你还可以给它添加在定义struct的时候没有指定的key。但是你不能删除定义时候已经指定的key。