Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Enums 为什么不保存在Enum.each中设置的变量?_Enums_Elixir - Fatal编程技术网

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

Enums 为什么不保存在Enum.each中设置的变量?,enums,elixir,Enums,Elixir,我试图在Enum.each中的函数中为变量设置一个值,但在循环结束时,变量为空,我不知道这种行为的确切原因 代码: 在本例中,return应该是[“stream”,“maters”],但它只是一个空列表:[] 我的问题是为什么会发生这种情况。不确定,因为我从未使用过这种语言,但我想到了几件事: String.length(base)=String.length(candidate)可以等效为true,这已经是集合中的一种模式 这也可能是返回变量的范围问题。可能是本地返回隐藏了全局返回。您可以通过

我试图在
Enum.each
中的函数中为变量设置一个值,但在循环结束时,变量为空,我不知道这种行为的确切原因

代码:

在本例中,
return
应该是
[“stream”,“maters”]
,但它只是一个空列表:
[]


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

不确定,因为我从未使用过这种语言,但我想到了几件事:

String.length(base)=String.length(candidate)
可以等效为true,这已经是集合中的一种模式


这也可能是返回变量的范围问题。可能是本地返回隐藏了全局返回。您可以通过每次迭代输出return来检查这一点。每次迭代返回的结果都应该包含一个条目。

为什么不进行筛选

不管怎么说,你似乎在试图改变回报的价值,而这在长生不老药中是不可能的

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

IO.inspect result
编辑:我还想补充一点,根据您的逻辑,所有候选人都将被返回

这是一个错误。发件人:

注意:由于0.12.x系列中的一个bug,cond的条件实际上是 将绑定泄漏到周围的作用域。这应该是固定的 0.13.1


你应该像@{Christopher Yammine}建议的那样使用过滤

在处理像Elixir这样的语言时,最好从“值”和“名称”而不是“变量”的角度来考虑

你不能做你想做的事的原因是长生不老药有。 分配给“变量”时,将在内部范围中创建一个新值。您永远不会更改外部范围中定义的“名称”的“值”

(使用
Enum.filter/2
,您可能可以得到您想要的,但我猜这只是一个示例)

编辑:

从今天起,Elixir将允许您编写以下内容:

if condition_that_evals_to_false do
  x = 1
else
  x = 2
end

IO.inspect x # => 2
```


但在Elixir 1.3中,这将被弃用。您对返回的所有内容都是正确的。我在这个例子中确实打了个错字,并且已经编辑过了。关于你的逻辑,是的,它比我的好得多,谢谢!)我的问题用你的逻辑解决了,但问题仍然需要回答。因此,我不能选择你的答案来结束这个问题。谢谢;)@Renan Ranelli给出了一个应该满足您需求的答案您认为本地值与全球值不同是正确的。您大约晚了9个月。Elixir目前在1.2.5上
if condition_that_evals_to_false do
  x = 1
else
  x = 2
end

IO.inspect x # => 2