Tôi đang xem xét sử dụng bản ghi Clojure để ánh xạ tới các thực thể thay đổi trong chương trình của tôi. Họ có thể thay đổi được không? Hay bạn cần phải sử dụng thêm refs trong hồ sơ? Tôi hơi bối rối về điều nàyTôi có thể tạo trạng thái có thể thay đổi bên trong bản ghi Clojure không?
9
A
Trả lời
12
Rất đáng xem Rich Hickey's fantastic video on identity and state.
Bản ghi được thiết kế là không thay đổi và lưu trữ trạng thái của giá trị nào đó.
Để mô hình trạng thái của một thực thể thay đổi, tôi khuyên bạn nên sử dụng giá trị ref đề cập đến giá trị bất biến đại diện cho trạng thái hiện tại. Bạn có thể sử dụng các bản ghi cho trạng thái bất biến, nhưng thường đơn giản hơn là chỉ sử dụng một bản đồ đơn giản.
Một ví dụ đơn giản, nơi mà các nhà nước có thể thay đổi là một bảng điểm cho một trò chơi:
; set up map of current scores for each player
(def scores
(ref
{:mary 0
:joe 0 }))
; create a function that increments scores as a side effect
(defn add-score [player amount]
(dosync
(alter scores update-in [player] + amount)))
; add some scores
(add-score :mary (rand-int 10))
(add-score :joe (rand-int 10))
; read the scores
@scores
=> {:mary 6, :joe 1}
5
Tôi đã thấy rằng tôi nhiều hơn nữa thường hồ sơ đặt trong refs hơn refs trong hồ sơ. Lời khuyên của mikira về việc sử dụng một bản đồ đơn giản nghe rất hay.
Bắt đầu với bản đồ và chuyển sang thứ gì đó ít linh hoạt hơn khi bạn phải.
Các vấn đề liên quan
- 1. AudioFlinger không thể tạo bản nhạc. trạng thái: -12
- 2. Điều gì có thể khiến XMLHttpRequest không bao giờ thay đổi trạng thái trong Firefox?
- 3. Tôi làm cách nào để viết máy chủ đa khách hàng không có trạng thái có thể thay đổi?
- 4. Tôi có thể thay đổi bảng từ bên trong ra bên ngoài trong tổ ong không?
- 5. Có thể thay đổi biểu tượng của thanh trạng thái (biểu tượng thông báo) động không?
- 6. Dữ liệu Ember: làm thế nào tôi có thể xóa/xóa một bản ghi bị kẹt trong trạng thái "inFlight"?
- 7. Làm cách nào để tôi có thể tạo trạng thái "AjaxLink" của Wicket?
- 8. Tôi có thể có trạng thái đa dòng trong Vim không?
- 9. Tôi không thể nhận được thông báo về thay đổi trạng thái pin?
- 10. Tôi có thể thêm các trường vào loại clojure không?
- 11. Không thể thay đổi trạng thái hiện diện của người dùng của tôi bằng Smack
- 12. Thanh trạng thái WPF, giãn khối văn bản để có nhiều không gian nhất có thể
- 13. Sử dụng OpenSSL "không thể ghi" trạng thái ngẫu nhiên "có nghĩa là gì?
- 14. HTTPS có trạng thái hoặc trạng thái không?
- 15. Bạn có thể tạo trạng thái lơ lửng trong Firebug "dính" không?
- 16. Có thể tạo trạng thái tùy chỉnh để sử dụng trong StateListDrawable không?
- 17. Chuyển đổi bản đồ có thể biến đổi thành bản đồ không thể thay đổi
- 18. trạng thái git - có cách nào chỉ hiển thị thay đổi trong một thư mục cụ thể không?
- 19. Có thể thay đổi mã trạng thái HTTP được trả về khi cổng proxy_pass bị tắt trong nginx không?
- 20. Có phải HashAlgorithm.ComputeHash() có trạng thái không?
- 21. Trong Clojure làm cách nào tôi có thể tạo chức năng "thêm id vào bản đồ"?
- 22. Làm cách nào tôi có thể định cấu hình Hudson để gửi email cho MỌI bản dựng, không chỉ những người thay đổi trạng thái của dự án?
- 23. NSJSONSerialization không tạo container có thể thay đổi
- 24. Task Dataflow, một khối dữ liệu có thể được thay đổi từ trạng thái hoàn thành không?
- 25. Hàng đợi không thể thay đổi trong Clojure
- 26. Cách ưu tiên để tạo bản sao có thể thay đổi của đối tượng không thể thay đổi được?
- 27. Tôi có thể "chuyển đổi" danh sách bản đồ thành bản đồ danh sách trong Clojure không?
- 28. Tôi có thể thay đổi giá trị của Environment.NewLine không?
- 29. Việc di chuyển có rời khỏi đối tượng trong trạng thái có thể sử dụng không?
- 30. Không thể hiểu trạng thái có thể tùy chỉnh của Android
Cả hai thay đổi và cập nhật tự động truyền theo bất kỳ đối số nào họ không hiểu, vì vậy điều này có thể chính xác hơn (và dễ đọc hơn) được viết dưới dạng '(thay đổi điểm cập nhật trong [trình phát] + số tiền)'. – amalloy
@amalloy - cảm ơn! tốt để tìm hiểu một thủ thuật mới :-) đã cập nhật – mikera