我试图在 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
在这个例子中,
return
应该是 ["stream", "maters"]
,但它只是一个空列表: []
我的问题是为什么会发生这种情况。
最佳答案
在处理像 Elixir 这样的语言时,最好从“值”和“名称”而不是“变量”的角度考虑。
你不能做你想做的事情的原因是 Elixir 有 "lexical scoping" 。
当您分配给“变量”时,您会在内部范围内创建一个新值。您永远不会更改在外部作用域中定义的“名称”的“值”。
(你可能可以用 Enum.filter/2
得到你想要的东西,但我猜这只是一个说明性的例子)
编辑:
截至今天,Elixir 将允许您编写如下内容:
if condition_that_evals_to_false do
x = 1
else
x = 2
end
IO.inspect x # => 2
``
但这将在 Elixir 1.3 中被弃用
关于enums - 为什么在 Enum.each 中设置的变量没有保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37283718/