Clojure - ผู้เฝ้าดู

Watchersเป็นฟังก์ชันที่เพิ่มให้กับประเภทตัวแปรเช่นอะตอมและตัวแปรอ้างอิงซึ่งจะถูกเรียกใช้เมื่อค่าของประเภทตัวแปรเปลี่ยนแปลง ตัวอย่างเช่นหากโปรแกรมเรียกใช้เปลี่ยนค่าของตัวแปรอะตอมและถ้าฟังก์ชันผู้เฝ้าดูแนบกับตัวแปรอะตอมฟังก์ชันจะถูกเรียกใช้ทันทีที่ค่าของอะตอมเปลี่ยนไป

ฟังก์ชั่นต่อไปนี้มีอยู่ใน Clojure for Watchers

เพิ่มนาฬิกา

เพิ่มฟังก์ชั่นนาฬิกาให้กับการอ้างอิงตัวแทน / อะตอม / var / ref นาฬิกา‘fn’ต้องเป็น 'fn' จาก 4 args: คีย์การอ้างอิงสถานะเก่าสถานะใหม่ เมื่อใดก็ตามที่สถานะของการอ้างอิงอาจมีการเปลี่ยนแปลงนาฬิกาที่ลงทะเบียนใด ๆ จะมีฟังก์ชันที่เรียกว่า

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์

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

Parameters- 'ตัวแปร' คือชื่อของอะตอมหรือตัวแปรอ้างอิง 'variable-type' คือประเภทของตัวแปรทั้งอะตอมหรือตัวแปรอ้างอิง 'old-state & new-state' คือพารามิเตอร์ที่จะเก็บค่าเก่าและใหม่ของตัวแปรโดยอัตโนมัติ "คีย์" จะต้องไม่ซ้ำกันต่อการอ้างอิงและสามารถใช้เพื่อถอดนาฬิกาออกโดยถอดนาฬิกาได้

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

คุณสามารถเห็นได้อย่างชัดเจนจากโปรแกรมด้านบนว่าคำสั่งรีเซ็ตครั้งที่สองไม่ทริกเกอร์ผู้เฝ้าดูเนื่องจากถูกลบออกจากรายการของผู้เฝ้าดู