我试图将值设置为<br />
中函数内的变量,但是在循环结束时,变量为空,我不知道为什么会出现这种行为。< / p>
代码:
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"]
我的问题是为什么会发生这种情况。
答案 0 :(得分:4)
您为什么不过滤?
无论如何,你好像试图改变Elixir无法实现的回报价值。
base = "master"
candidates = ["stream", "pigeon", "maters"]
result = Enum.filter(candidates, fn(candidate) ->
length(candidate) == length(base)
end
IO.inspect result
编辑:我还想根据您的逻辑添加,所有候选人都将被退回
答案 1 :(得分:4)
在处理像Elixir这样的语言时,最好用&#34;值来思考&#34;和&#34;名字&#34;而不是&#34;变量&#34;。
你不能做你想做的事是Elixir有"lexical scoping"。 当您分配到&#34;变量&#34;时,您在内部范围中创建一个新值。你永远不会改变&#34;值&#34;一个&#34;名称&#34;在外部范围内定义。
(你可能可以通过Enum.filter/2
得到你想要的东西,但我猜这只是一个说明性的例子)
编辑:
截至今天,Elixir将允许你写这样的东西:
if condition_that_evals_to_false do
x = 1
else
x = 2
end
IO.inspect x # => 2
```
但是这将在Elixir 1.3中弃用
答案 2 :(得分:0)
不确定,因为我从未使用过该语言,但有几件事情会浮现在脑海中:
String.length(base) == String.length(candidate)
可以等同于true,这已经是你集合中的模式。
它也可能是返回变量的范围问题。可能是本地回报隐藏了全球回报。您可以通过每次迭代输出返回来检查这一点。返回的每次迭代都应该包含一个条目。
答案 3 :(得分:-1)
这是一个错误。来自Elixir's documentation:
注意:由于0.12.x系列中的错误,实际上是cond的条件 泄漏绑定到周围的范围。这应该修复 0.13.1。
您应该使用像@ {Christopher Yammine}建议的过滤。