2011-01-04 37 views
6

Tôi có một def trong một không gian tên mà tôi muốn khởi tạo một lần khi ứng dụng được bắt đầu, nhưng mỗi khi không gian tên chứa "def" được "sử dụng" và: tải lại từ một không gian tên khác thì "def" được đánh giá lại. Làm thế nào tôi có thể ngăn chặn các "def" từ được tái evaulated trong quá trình tải lại này?Làm thế nào tôi có thể nhận được một "def" để không tải lại trong clojure?

Trả lời

13

defonce sẽ giúp bạn gần gũi mặc dù nó vẫn sẽ được định nghĩa một lần nữa nếu không gian tên là: reloaded vì (use 'my.namespace :reload) đầu tiên ném ra gốc rễ cũ ràng buộc.

Defonce là một macro kiểm tra xem var đã có một ràng buộc gốc trong không gian tên đã cho và sau đó chỉ định nghĩa nó nếu nó không có. Bạn có thể sử dụng điều này để giải quyết vấn đề của bạn bằng cách đặt def đặc biệt này vào không gian tên riêng của nó với một (in-ns ...) để bảo vệ nó khỏi bị xóa sổ bằng cách tải lại. sau đó bạn có thể tải lại không gian tên 'chính' thường xuyên như bạn muốn và mã chỉ nên được xác định một lần.

+0

này, hành vi này có thay đổi kể từ câu trả lời này không? Tôi đã thử thêm một (defonce x 5) vào namespace, bắt đầu repl, x là 5, sau đó tôi thay đổi nó trong nguồn, thử (yêu cầu: tải lại 'test) và (use: reload' test) và x vẫn là 5 – Hendekagon

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