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

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