我想從M2方法來訪問M1方法的參數x。如何從將其在在酏劑的相同模塊的另一種方法設置的方法訪問變量?
defmodule MyModule do
def m1(x) do
# some code
end
def m2() do
# Accesss 'x' here
IO.puts x
end
end
如何從方法m2訪問x?
我想從M2方法來訪問M1方法的參數x。如何從將其在在酏劑的相同模塊的另一種方法設置的方法訪問變量?
defmodule MyModule do
def m1(x) do
# some code
end
def m2() do
# Accesss 'x' here
IO.puts x
end
end
如何從方法m2訪問x?
由於希內克-Pichi- Vychodil
ETS(Erlang Term Storage)提供了在表的形式存儲器存儲健壯。任何數據都可以使用鍵值對存儲到表中。
這裏是我的解決方案:
defmodule MyModule do
def m1(x) do
# Create named table and insert the variable
:ets.new(:user_lookup, [:set, :protected, :named_table])
:ets.insert(:user_lookup, {"key", x})
# some code
end
def m2() do
# Accesss 'x' here by using table lookup
[{_, x}] = :ets.lookup(:user_lookup, "key")
IO.puts x
end
end
沒有違法,但根據你的使用情況,好像你所想的OOP,在花好月圓我們真的沒有「全局變量」的概念,你可以嘗試這樣的事情呢?
defmodule MyModule do
def m1(x) do
m2(x) # Call m2 with x
end
def m2(param) do
IO.puts param
end
end
你不能這樣做。正是在BEAM禁止運行,因此它在Erlang和藥劑以及所有其他基於BEAM語言。這是您必須透明地爲每個函數調用提供所有必需的輸入數據的預期行爲。您可以使用Erlang Run-Time System (erts
)的其他組件模擬它。例如,你可以使用ets
(Erlang Term Storage)或者你可以使用過程中的工作因爲提供這種存儲服務器。這個限制是製造Erlang最主要目的的高度可靠系統的基本構件。有關更多信息,請閱讀Making reliable distributed systems in the presence of software errors論文。它在工作開始時被描述爲最好的。
我不想從M1 M2打電話。方法m2將被另一個模塊調用。 –