2011-01-04 5 views
6

Ich habe ein Def in einem Namespace, den ich einmal beim Start der Anwendung initialisieren möchte, aber jedes Mal, wenn der Namespace, der das "def" enthält, "verwendet" und: von einem anderen Namespace neu geladen wird, wird das "def" neu ausgewertet. Wie kann ich verhindern, dass das "def" während dieses Nachladens erneut ausgewertet wird?Wie kann ich ein "def" bekommen, um nicht in clojure neu zu laden?

Antwort

13

defonce werden Sie in der Nähe bekommen, obwohl es noch einmal definiert werden, wenn der Namespace ist: neu geladen, weil (use 'my.namespace :reload) erste Bindung der alte Wurzel wirft.

Defonce ist ein Makro, das prüft, ob die Variable bereits eine Root-Bindung im angegebenen Namespace hat und diese nur dann definiert, wenn dies nicht der Fall ist. Sie können dies verwenden, um Ihr Problem zu lösen, indem Sie dieses spezielle def in einen eigenen Namespace mit einer (in-ns ...) setzen, um es davor zu schützen, durch ein Nachladen ausgelöscht zu werden. Anschließend können Sie den Namespace "Haupt" beliebig oft neu laden und der Code sollte nur einmal definiert werden.

+0

hey, hat sich dieses Verhalten seit dieser Antwort geändert? Ich habe versucht, ein (defonce x 5) zu einem Namespace hinzufügen, ein repl starten, x ist 5, dann habe ich es in der Quelle geändert, versucht (erfordern: Test neu laden) und (verwenden: reload 'Test) und noch x ist immer noch 5 – Hendekagon

Verwandte Themen