Учебники

Clojure — Наблюдатели

Наблюдатели — это функции, добавляемые к типам переменных, таким как атомы и ссылочные переменные, которые вызываются при изменении значения типа переменной. Например, если вызывающая программа изменяет значение переменной атома, и если функция переменной наблюдателя присоединена к переменной атома, функция будет вызвана, как только значение атома будет изменено.

Следующие функции доступны в Clojure для наблюдателей.

надстройку часы

Добавляет функцию наблюдения в ссылку agent / atom / var / ref. Часы ‘fn’ должны быть ‘fn’ из 4 аргументов: ключ, ссылка, его старое состояние, его новое состояние. Всякий раз, когда состояние ссылки могло быть изменено, любые зарегистрированные часы будут вызывать свои функции.

Синтаксис

Ниже приводится синтаксис.

(add-watch variable :watcher
   (fn [key variable-type old-state new-state]))

Параметры — переменная — это имя атома или ссылочной переменной. ‘тип переменной’ — это тип переменной, атом или ссылочная переменная. ‘old-state & new-state’ — это параметры, которые будут автоматически хранить старое и новое значение переменной. «Ключ» должен быть уникальным для каждой ссылки и может использоваться для удаления часов с помощью remove-watch.

Возвращаемое значение — Нет.

пример

Пример того, как это используется, показан в следующей программе.

Live Demo

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def x (atom 0))
   (add-watch x :watcher
      (fn [key atom old-state new-state]
      (println "The value of the atom has been changed")
      (println "old-state" old-state)
      (println "new-state" new-state)))
(reset! x 2))
(Example)

Выход

Вышеуказанная программа производит следующий вывод.

The value of the atom has been changed
old-state 0
new-state 2

удалить-часы

Удаляет часы, которые были прикреплены к ссылочной переменной.

Синтаксис

Ниже приводится синтаксис.

(remove-watch variable watchname)

Параметры — переменная — это имя атома или ссылочной переменной. ‘watchname’ — это имя, данное часам при определении функции часов.

Возвращаемое значение — Нет.

пример

Пример того, как это используется, показан в следующей программе.

Live Demo

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def x (atom 0))
   (add-watch x :watcher
      (fn [key atom old-state new-state]
         (println "The value of the atom has been changed")
         (println "old-state" old-state)
         (println "new-state" new-state)))
   (reset! x 2)
   (remove-watch x :watcher)
(reset! x 4))
(Example)

Выход

Вышеуказанная программа производит следующий вывод.

The value of the atom has been changed
old-state 0
new-state 2

Из вышеприведенной программы вы можете четко видеть, что вторая команда сброса не вызывает наблюдателя, поскольку она была удалена из списка наблюдателя.