2012-10-09 36 views
7

Nhìn vào clojure.testsource code, tôi phát hiện những điều sau:Việc sử dụng ^: động trên xác thực là gì?

(defonce ^:dynamic 
    ^{:doc "True by default. If set to false, no test functions will 
    be created by deftest, set-test, or with-test. Use this to omit 
    tests when compiling or loading production code." 
    :added "1.1"} 
    *load-tests* true) 

Có lợi ích hoặc lý do đằng sau việc ngăn ngừa sự tái định nghĩa (ví dụ: sử dụng defonce) của một var được đánh dấu là ^:dynamic?

+0

Có thể ngăn chặn cảnh báo từ trình biên dịch về việc có var không động có tên '* something *' không? – thoferon

+0

Sau đó, câu hỏi sẽ là lý do tại sao sử dụng earmuffs trên tên, đó là thể hiện cùng một nghĩa chính xác của '^: dynamic' trong các phiên bản cũ của Clojure. Tôi sẽ kiểm tra nếu các phiên bản trước của 'clojure.test' đang sử dụng các chiến lược' def' khác nhau cho var đó. – skuro

Trả lời

4

defonce không ngăn định nghĩa lại nói chung, nhưng chỉ khi tải lại tệp. Điều này là hữu ích điển hình khi var là duy trì một số loại trạng thái hoặc ngữ cảnh. Tôi tin rằng việc sử dụng defonce ở đây, có thể là một tạo tác từ sự phát triển của thư viện, nơi mà nhà phát triển cần tải lại tệp nhiều lần trong quá trình phát triển trong khi vẫn muốn giữ lại cùng một giá trị.

Vì var không trỏ đến ref, nhưng var trực tiếp, sử dụng ^:dynamic là lựa chọn đúng. Bây giờ mã có thể sử dụng set! hoặc binding để thay đổi giá trị theo cách địa phương.

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