Clojure - Наблюдатели
Watchers- это функции, добавляемые к типам переменных, таким как атомы и ссылочные переменные, которые вызываются при изменении значения типа переменной. Например, если вызывающая программа изменяет значение переменной атома, и если к переменной атома прикреплена функция-наблюдатель, функция будет вызываться сразу после изменения значения атома.
В Clojure для наблюдателей доступны следующие функции.
добавить часы
Добавляет функцию наблюдения к ссылке agent / atom / var / ref. Часы‘fn’должен быть 'fn' из 4 аргументов: ключ, ссылка, его старое состояние, его новое состояние. Всякий раз, когда состояние ссылки могло быть изменено, любые зарегистрированные часы будут вызывать свои функции.
Синтаксис
Ниже приводится синтаксис.
(add-watch variable :watcher
(fn [key variable-type old-state new-state]))
Parameters- «переменная» - это имя атома или ссылочной переменной. «Тип-переменной» - это тип переменной: атомная или ссылочная переменная. «старое-состояние» и «новое-состояние» - это параметры, которые автоматически содержат старое и новое значение переменной. key должен быть уникальным для каждой ссылки и может использоваться для удаления часов с помощью remove-watch.
Return Value - Нет.
пример
Пример того, как это используется, показан в следующей программе.
(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)
Parameters- «переменная» - это имя атома или ссылочной переменной. «watchname» - это имя, присвоенное часам при определении функции часов.
Return Value - Нет.
пример
Пример того, как это используется, показан в следующей программе.
(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
Из приведенной выше программы ясно видно, что вторая команда сброса не запускает наблюдателя, поскольку он был удален из списка наблюдателя.