如何在函数内部进行多个全局变量编辑?

时间:2015-11-27 11:18:14

标签: elixir phoenix-framework

我是elixir的新手,并使用iex测试从MeteorJS到elixir(凤凰)的一些代码可移植性

iex> x = 1
1
iex> (fn -> x * 2 end).()
2
iex> x
1
上面的代码x * 2中的

只影响内部函数,实际上我希望在函数执行后编辑(内部函数)到外部

我最初期望x = 1,并且在执行该函数之后x = 2

如何在elixir中的函数内进行多个全局变量编辑?

2 个答案:

答案 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还有助于消除并发代码具有竞争条件的常见情况,因为两个不同的实体正在尝试同时更改数据结构。