2011-01-04 16 views
6

Mam def w przestrzeni nazw, które chcę zainicjować raz, gdy aplikacja jest uruchamiana, ale za każdym razem, gdy przestrzeń nazw zawierająca "def" jest "używana" i: ponownie ładowana z innej przestrzeni nazw, "def" jest ponownie obliczana. Jak mogę zapobiec ponownemu sprawdzeniu "def" podczas tego ładowania?Jak mogę uzyskać "def", aby nie ładować ponownie w clojure?

Odpowiedz

13

defonce będzie Ci blisko choć nadal będzie ponownie, jeśli jest zdefiniowana przestrzeń nazw: reloaded ponieważ (use 'my.namespace :reload) najpierw wyrzuca stare wiązania korzeń.

Defonce to makro, które sprawdza, czy var ma już powiązanie root w danej przestrzeni nazw, a następnie definiuje je tylko wtedy, gdy tak nie jest. Możesz tego użyć, aby rozwiązać problem, umieszczając tę ​​specjalną def w swojej własnej przestrzeni nazw za pomocą (in-ns ...), aby chronić ją przed zniszczeniem przez ponowne załadowanie. wtedy możesz przeładować "główną" przestrzeń nazw tak często, jak chcesz, a kod powinien być zdefiniowany tylko raz.

+0

hej, czy to zachowanie zmieniło się od czasu tej odpowiedzi? Próbowałem dodać (defonce x 5) do przestrzeni nazw, uruchamiając replikę, x to 5, potem zmieniłem je w źródle, próbowałem (wymagają: przeładowanie "testu) i (użyj: przeładuj" test), a x wciąż jest 5 – Hendekagon

Powiązane problemy