enums - 为什么在 Enum.each 中设置的变量没有保存?

标签 enums elixir

我试图在 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/

相关文章:

elixir - 如何在Phoenix布局中定义多个 "yield :something"?

java枚举混淆

枚举上的 F# 类型约束

C++使用位移位分配显式枚举值

elixir - 如何测试 Ecto 迁移

elixir - 如何从 Elixir 中的元组列表中提取整数?

regex - 在 Elixir 中,如何用非单词字符作为分隔符来分割字符串,同时还允许使用 +、- 等数学运算符?

api - 如何在REST API中公开枚举值

C++ 枚举重新定义和 C++0x

elixir - 强制 Phoenix 渲染 JSON 错误