2016-01-13 54 views
0

在clojure中,聲明一個全局變量的最佳方式是什麼,其中的值需要在函數中進行更改,而此全局變量需要在Clojure中如何定義一個可以從其他名稱空間訪問的全局變量

(ns ..main 
.....) 

(def global_variable nil) 
.. 
(defn main ... 

Change the value of global variable here 

) 

Another name space 

(ns accessvariable ...) 

(println (main/global_variable)) 

什麼是做到這一點的最好辦法:在其他命名空間

防爆要訪問?

+2

這在Clojure社區中通常被認爲是一個壞主意。爲什麼你需要這樣做?你面臨什麼問題,這將解決? –

+1

原子是爲此而建造的。也就是說,幾乎總是有更好的方法來解決這類問題。如果您給我們更多的細節,我們可以幫助您使用Clojure的優勢解決您的問題。 – WolfeFan

+0

謝謝@Elogent和WolfeFan。當我運行我的PGM用戶輸入一些命令行參數時,我想在多個名稱空間中的參數值不直接從我的主名稱空間調用。在Java中,我可以使用setter方法設置類/實例變量,並使用其他對象中的getter方法來獲取值。這是如何在clojure中完成的? – gechu

回答

0

只存儲一個原子在你的全局變量:

(def global-var (atom nil)) 
+0

感謝Elogent的幫助 – gechu

+0

@gechu你應該感謝dAni;我剛剛編輯了他的答案。 :) –

0

注:這是在迴應有關問題的第三點意見。 dAni's answer適用於問題。

習慣Clojure傾向於功能,其輸出僅由其輸入參數確定。這與依賴其參數和全局狀態的功能相反。很容易將使用全局數據的函數轉換爲不使用全局數據的函數 - 您只需添加一個將包含數據的參數即可。例如:而不是(defn print-global [] (println @global-atom-defined-elsewhere)),您使用(defn print-my-val [val] (println val))

如果您非常頻繁地使用命令行參數,您可能仍然會發現將數據放入全局原子中更方便,而不是將所有內容都用作參數。這取決於你。

+0

感謝WolfeFan的幫助 – gechu

相關問題