2010-06-17 42 views
5

Tôi có một số nguyên tử trong mã của tôi khi yêu cầu chung là cập nhật chúng thành một giá trị mới, bất kể giá trị hiện tại.Cập nhật một nguyên tử với một giá trị đơn

do đó tôi thấy mình viết một cái gì đó như thế này:

(swap! atom-name (fn [_] (identity new-value))) 

này hoạt động nhưng có vẻ khá xấu xí và có lẽ phải gánh chịu một hình phạt hiệu suất cho xây dựng đóng cửa vô danh.

Có cách nào tốt hơn không?

Trả lời

8

Chức năng reset! sẽ thực hiện việc này.

(reset! atom-name new-value) 
+0

tuyệt vời ... chính xác những gì tôi đang tìm kiếm! – mikera

1

Bạn có thể sử dụng (giá trị mới giá trị cũ so sánh và đặt nguyên tử).

Nhưng tôi thấy nó lạ bạn cần phải thay đổi chúng rất nhiều đến các giá trị không tương quan. Bạn không thể sử dụng các ràng buộc hay những thứ tương tự.

+0

Đó là để quản lý một đơn vị trạng thái đồng thời chia sẻ qua các chuỗi sao cho các liên kết không hoạt động. Các nguyên tử AFAICS dường như là cách tiêu chuẩn để thực hiện điều này ..... – mikera

+0

Đúng, nhưng tôi lo lắng về ngữ nghĩa của một biến toàn cầu thay đổi thường xuyên thành một giá trị không thể biến đổi từ giá trị trước đó. Với một ràng buộc, bạn tạo một ảnh chụp nhanh của trạng thái "được chia sẻ" cho đến khi phạm vi chụp được để lại. Nếu điều này là không thể chấp nhận được thì phải có sự phụ thuộc thời gian giữa các luồng và và một số loại liên lạc giữa các luồng thông qua nguyên tử. Tôi đã không đi qua một trường hợp sử dụng như thế này, tôi thường chỉ có những thứ như cấu hình, tập hợp, hoặc phiên/cache trong nguyên tử. –

+0

Ví dụ: bộ hẹn giờ trong mô phỏng. Các chủ đề khác nhau có thể cần phải đọc dấu thời gian toàn cầu mới nhất, chỉ có một luồng bao giờ cập nhật nó. Cập nhật độc lập với giá trị trước đó. – mikera

Các vấn đề liên quan