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

时间:2016-05-17 18:26:59

标签: enums elixir

我试图将值设置为<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"]

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

4 个答案:

答案 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}建议的过滤。