Наблюдатели — это функции, добавляемые к типам переменных, таким как атомы и ссылочные переменные, которые вызываются при изменении значения типа переменной. Например, если вызывающая программа изменяет значение переменной атома, и если функция переменной наблюдателя присоединена к переменной атома, функция будет вызвана, как только значение атома будет изменено.
Следующие функции доступны в 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.
Возвращаемое значение — Нет.
пример
Пример того, как это используется, показан в следующей программе.
(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’ — это имя, данное часам при определении функции часов.
Возвращаемое значение — Нет.
пример
Пример того, как это используется, показан в следующей программе.
(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
Из вышеприведенной программы вы можете четко видеть, что вторая команда сброса не вызывает наблюдателя, поскольку она была удалена из списка наблюдателя.