目录
当前位置: 首页 > 文档资料 > Clojure 入门教程 >

23 引用类型

优质
小牛编辑
123浏览
2023-12-01

引用类型

引用类型是一种可变引用指向不可变数据的一种机制。Clojure里面有4种引用类型:Vars,Refs,Atoms和Agents. 它们有一些共同的特征:

  • 它们都可以指向任意类型的对象。
  • 都可以利用函数 deref 以及宏 @ 来读取它所指向的对象。
  • 它们都支持验证函数,这些函数在它们所指向的值发生变化的时候自动调用。如果新值是合法的值,那么验证函数简单的返回true, 如果新值是不合法的,那么要么返回false, 要么抛出一个异常。如果只是简单地返回了 false , 那么一个 IllegalStateException 异常会被抛出,并且带着提示信息: "Invalid reference state" 。
  • 如果是Agents的话,它们还支持watchers。如果被监听的引用的值发生了变化,那么Agent会得到通知, 详情见 "Agents" 一节。

下面的这个表格总结了一下四种引用类型的区别,以及分别要用什么方法去创建或者修改它们。这个表格里面提到的函数我们会在后面介绍。

VarRefAtomAgent
目的同步对于一个线程本地(thread-local)的变量的修改。同步、协调对于一个或者多个值的修改同步对于一个值的修改对一个值进行异步修改
创建方法(def name initial-value)(ref initial-value)(atom initial-value)(agent initial-value)
修改方法(def name new-value) - 可以赋新的值 (alter-var-root (var name) update-fn args) - 自动设置新值 (set! name new-value) - 在一个binding form 里满设置一个新的、线程本地的值(ref-set ref new-value) - 必须在dosync里面调用 (alter ref update-fn arguments) - 必须在dosync里面调用 (commute ref update-fn arguments) - 必须在 dosync 里面调用(reset! atom new-value) (compare-and-set! atom current-value new-value) (swap! atom update-fn arguments)(send agent update-fn arguments) (send-off agent update-fn arguments)