Clojure语言五:StructMap

参考官方文档: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对应的值被返回。










你可能感兴趣的:(Clojure语言五:StructMap)