使用for循环填充List

0xA*_*ffe 8 for-loop elixir

为什么我不能用这个简单的for循环填充列表?

new_data = []
for data <- old_data do
  new_data = List.insert_at(new_data, -1, data)
end
Run Code Online (Sandbox Code Playgroud)

在此操作之后new_data,即使循环执行了N次,我的列表仍然为空.

Gaz*_*ler 21

在Elixir中,你不能改变你的变量引用的值,正如Are Elixir变量真正不可变的那样?.因为在这种情况下不是"循环"它是列表理解.

您可以使用以下内容分配理解结果:

new_data = for data <- old_data do
  data
end
Run Code Online (Sandbox Code Playgroud)

在你的行:

new_data = List.insert_at(new_data, -1, data)
Run Code Online (Sandbox Code Playgroud)

该new_data变量是本地的理解的范围.您可以使用以前的new_data值,但无法重新绑定外部范围.这new_data仍然是[]你理解之后的原因.范围规则在http://elixir-lang.readthedocs.org/en/latest/technical/scoping.html中进行了解释.