2015-11-27 76 views
0

我在靈藥使用IEX在上面的代碼x * 2從MeteorJS測試一些代碼移植到靈藥(鳳凰)我怎樣才能做一個函數內的多個全局變量編輯?

iex> x = 1 
1 
iex> (fn -> x * 2 end).() 
2 
iex> x 
1 

&新只有內部功能的影響,其實我要的是編輯(內部功能)外該函數執行

後,我期待x = 1最初和X = 2是函數執行

我怎樣才能做到像仙丹的函數內的多個全局變量編輯後?

回答

1

你不能改變函數內的變量的值。您可以將您的變量函數

x = (fn -> x * 2 end).() 

的返回值來獲得多個變量,你可以返回一個元組或列表

{x,y} = (fn -> {x * 2, y * 4} end).() 

這是由於在劃定範圍仙丹的工作方式。您可以考慮在自己的環境中運行的函數,其中包含變量。

當你聲明變量x=1它被稱爲「全局控制檯」環境。當您定義該功能時,該功能可使用變量x。但是你必須記住,這個函數在自己的環境中執行。對變量所做的任何更改僅在此函數的環境中有效,因此您看不到「全局控制檯」環境中的更改。 如果你喜歡,你可以存儲執行此功能的結果如上所示

它的概念稱爲不變性,靈藥和許多功能類似的語言遵循。通過不可變,Elixir代碼更容易推理,因爲如果某個特定的代碼正在改變您的數據結構,您永遠不需要擔心。

通過不可變,Elixir還有助於消除併發代碼具有競爭條件的常見情況,因爲兩個不同的實體試圖同時更改數據結構。

2

這是一個範圍問題,我已在Fill a List with a for-loop中解釋過。在入門指南中有具體提及http://elixir-lang.org/getting-started/basic-types.html#anonymous-functions

您需要將該值重新綁定到該函數的結果。這是因爲函數在自己的範圍內運行。

iex> x = 1 
1 
iex> x = (fn -> x * 2 end).() 
2 
iex> x 
2 

您不是全局編輯變量。你正在重新認識一個新的價值。重新綁定前對x的所有引用仍將引用舊值(1)。

+0

@lintocheeran恐怕我不明白你的問題。請你能更詳細些嗎? – Gazler

相關問題