Hãy nhớ rằng sự chậm trễ được ghi nhớ, do đó, các cuộc gọi liên tiếp của các địa chỉ của bạn bị chậm trễ sẽ luôn mang lại cùng một địa chỉ như lần đầu tiên bạn hủy đăng ký trễ.
(defn addresses [person-id]
{:home (str (rand-int 100) " Cool St.") :work "1243 Boring St."})
(defn person [id]
(merge {:addresses (delay (addresses id))} {:name "john"}))
(let [person1 (person 1)]
(println @(:addresses person1))
(println @(:addresses person1)))
này sẽ in:
{:home 65 Cool St., :work 1243 Boring St.}
{:home 65 Cool St., :work 1243 Boring St.}
Thông báo như thế nào địa chỉ nhà là không thay đổi trên deref thứ hai của sự chậm trễ.
Nếu bạn không muốn hành vi này, bạn cần phải sử dụng chức năng đóng để thay thế.
(defn addresses [person-id]
{:home (str (rand-int 100) " Cool St.") :work "1243 Boring St."})
(defn person [id]
(merge {:addresses (fn [] (addresses id))} {:name "john"}))
(let [person1 (person 1)]
(println ((:addresses person1)))
(println ((:addresses person1))))
này sẽ in:
{:home 16 Cool St., :work 1243 Boring St.}
{:home 31 Cool St., :work 1243 Boring St.}
Thông báo như thế nào địa chỉ nhà là khác nhau về các cuộc gọi tiếp theo; đến việc đóng cửa.
Vì vậy, nếu bạn đang sử dụng chức năng addresses
, hãy tìm nạp địa chỉ từ cơ sở dữ liệu. Và những người có thể thay đổi địa chỉ của họ và bạn muốn mã của mình luôn có địa chỉ mới nhất, đó là điều cần ghi nhớ nếu Delay hoạt động cho bạn hoặc nếu đóng cửa chức năng sẽ là ứng cử viên tốt hơn.
Nguồn
2015-10-25 01:03:32
cảm ơn bạn rất nhiều .Tôi đã tự hỏi nếu điều này có thể được thực hiện minh bạch để nó có thể được đánh giá lần đầu tiên nó được sử dụng. Thay vì buộc đánh giá theo cách thủ công? – Surya
Tôi không nghĩ vậy. Clojure rõ ràng là lười biếng và ép buộc, theo như tôi biết. –
lazymap của tôi [thư viện] (http://bitbucket.org/kotarak/lazymap) thực hiện chính xác điều đó. Nó cung cấp các trình đơn thả xuống trong suốt cho tất cả các loại bản đồ, chỉ tính giá trị của chúng trong trường hợp chúng thực sự được truy xuất. – kotarak