我是elixir的新手,并使用iex测试从MeteorJS到elixir(凤凰)的一些代码可移植性
iex> x = 1
1
iex> (fn -> x * 2 end).()
2
iex> x
1
上面的代码x * 2
中的只影响内部函数,实际上我希望在函数执行后编辑(内部函数)到外部
我最初期望x = 1
,并且在执行该函数之后x = 2
如何在elixir中的函数内进行多个全局变量编辑?
答案 0 :(得分: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)。
答案 1 :(得分:1)
您无法更改函数内变量的值。您可以为变量分配函数的返回值
x = (fn -> x * 2 end).()
要获取多个变量,您可以返回元组或列表
{x,y} = (fn -> {x * 2, y * 4} end).()
这是因为灵丹妙药的作用方式。您可以考虑在自己的环境中运行的函数,包括变量。
当您声明变量x=1
时,它在“全局控制台”环境中给出。定义函数时,变量x
可用于此函数。但是你必须记住这个函数在它自己的环境中执行。对变量所做的任何更改仅在此函数的环境中有效,因此您不会在“全局控制台”环境中看到更改。
如果您愿意,可以存储执行此功能的结果,如上所示
它是一个名为immutability的概念,即elixir和许多功能类似的语言。 From the docs: -
通过不可变,Elixir代码更易于推理,因为如果特定代码正在改变您的数据结构,您永远不必担心。
通过不可变,Elixir还有助于消除并发代码具有竞争条件的常见情况,因为两个不同的实体正在尝试同时更改数据结构。