我正在尝试为 中的函数内的变量设置一个值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)
编辑:我还想补充一点,根据您的逻辑,所有候选人都会被退回
在处理 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 中被弃用