什么是统一更新模型?

时间:2016-09-03 18:05:08

标签: clojure functional-programming

GitHub上的

This Clojure code指的是统一更新模型。

您能解释getSomething().subscribe(new Subscriber<Something>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Something something) { //update database of something } }); 函数如何与统一更新模型配合使用吗?

fixing

1 个答案:

答案 0 :(得分:13)

统一更新模型是API约定,各种引用类型的对象可以以一致的方式更新,尽管具有专门的功能:

;; Atoms
(swap! the-atom f …)

;; Agents
(send the-agent f …)
(send-off the-agent f …)
;; send-via takes an additional initial argument, but otherwise
;; follows the same convention (and of course it's an exact match
;; when partially applied – (partial send-via some-executor))
(send-via executor the-agent f …)

;; Refs
(dosync
  (alter the-ref f …)
  (commute the-ref f…))

在每种情况下f是应该用于更新Atom / Agent / Ref所持有的值的函数,是附加参数,如果有的话(例如(swap! the-atom f 1 2 3)) ,并且调用的结果是引用将原子地假设值(f old-value …) - 尽管恰好在swap! / alter / send / { ...调用取决于所讨论的引用类型和使用的更新函数。

以下是一个例子:

(def a (atom 0))
(swap! a - 5)
@a
;= -5

Vars通常不会用于与上述引用类型相同的目的,但它们也具有相同合同的更新功能:

(alter-var-root #'the-var f …)

最后,updateupdate-in函数在这方面值得一提;实际上,它们将统一更新模型约定扩展为 - 当然,值是不可变的,因此调用updateupdate-in不会导致任何对象明显< em>已更改,但返回值的生成与将更新函数应用于预先存在的值以及可能的一些额外参数的结果类似:

(update {:foo 1} :foo inc)
;= {:foo 2}

在UUM更新调用的上下文中,问题中引用的fixing函数比fix(在同一名称空间中定义)更好,因为它可以以一种网格很好的方式传递多个参数UUM更新功能如swap!工作,而fix你必须使用匿名函数:

;; the example from the docstring of fixing
(swap! my-atom fixing map? update-in [k] inc)

;; modified to use fix
(swap! my-atom fix map? #(update-in % [k] inc))