如何从elixir中同一模块的另一个方法中设置的方法访问变量?

时间:2017-09-12 04:04:12

标签: erlang elixir

我想从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?

3 个答案:

答案 0 :(得分:4)

你不能这样做。在BEAM中禁止操作,因此它在Erlang和Elixir以及所有其他基于BEAM的语言中。您必须透明地为每个函数调用提供所有必需的输入数据。您可以使用Erlang Run-Time System (erts)的其他组件来模拟它。例如,您可以使用ets (Erlang Term Storage),也可以将进程用作提供此类存储的服务器。这种约束是构建高度可靠系统的基本构建块,这是Erlang的主要目的。有关更多信息,请阅读Making reliable distributed systems in the presence of software errors论文。它在工作开始时描述得最好。

答案 1 :(得分:0)

没有冒犯,但根据你的用例,似乎你在OOP中思考,在Elixir中我们并没有真正拥有"全局变量"的概念,你能尝试这样的事情吗?代替?

defmodule MyModule do

    def m1(x) do
        m2(x) # Call m2 with x
    end

    def m2(param) do
        IO.puts param
    end
end

答案 2 :(得分:0)

感谢Hynek -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