为什么在 Enum.each 中设置的变量没有保存?

Ale*_*ert 3 enums elixir

我正在尝试为 中的函数内的变量设置一个值Enum.each,但在循环结束时,变量为空,我不知道为什么会出现这种行为。

代码:

base = "master"
candidates = ["stream", "pigeons", "maters"]

return = []
Enum.each(candidates, fn candidate ->
    cond do
        String.length(base) == String.length(candidate) ->
            return = return ++ [candidate]
        true ->
            true
    end
end)
IO.inspect return
Run Code Online (Sandbox Code Playgroud)

在这个例子中,return应该是["stream", "maters"],但它只是一个空列表:[]

我的问题是为什么会发生这种情况。

小智 5

你有什么理由不直接过滤吗?

无论如何,你似乎正在尝试改变 return 的值,这对于 Elixir 来说是不可能的。

base = "master"
candidates = ["stream", "pigeon", "maters"]
result = Enum.filter(candidates, fn(candidate) ->
  length(candidate) == length(base)
end

IO.inspect result
Run Code Online (Sandbox Code Playgroud)

编辑:我还想补充一点,根据您的逻辑,所有候选人都会被退回


Ren*_*lli 5

在处理 Elixir 之类的语言时,最好从“值”和“名称”而不是“变量”方面考虑。

你不能做你想做的事情的原因是 Elixir 有“词法范围”。当您分配给“变量”时,您会在内部范围内创建一个新值。您永远不会更改在外部作用域中定义的“名称”的“值”。

(你可能可以得到你想要的Enum.filter/2,但我猜这只是一个说明性的例子)

编辑:

截至今天,Elixir 将允许您编写如下内容:

if condition_that_evals_to_false do
  x = 1
else
  x = 2
end

IO.inspect x # => 2
Run Code Online (Sandbox Code Playgroud)

``

但这将在 Elixir 1.3 中被弃用