【问题标题】:Fill a List with a for-loop用 for 循环填充列表
【发布时间】:2016-02-23 04:15:06
【问题描述】:

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

new_data = []
for data <- old_data do
  new_data = List.insert_at(new_data, -1, data)
end

在这个操作之后,我的new_data 列表仍然是空的,即使循环被执行了 N 次。

【问题讨论】:

  • 记住,在函数式编程中,一般来说,everything 都是一个表达式。正如@Gazler 在下面指出的那样,您可以直接将理解的结果分配给一个值,因此您不需要执行“将值初始化为空值然后分配它”模式。
  • 顺便说一句,这不是 Erlang 问题。我正在从中删除 erlang 标记。

标签: for-loop elixir


【解决方案1】:

在 Elixir 中,您不能改变变量引用的值,如 Are Elixir variables really immutable? 中所述。因为在这种情况下,它不是“循环”,而是list comprehension

您可以使用以下命令分配推导的结果:

new_data = for data <- old_data do
  data
end

在你的行中:

new_data = List.insert_at(new_data, -1, data)

new_data 变量在理解范围内是本地的。您可以使用之前的 new_data 值,但您将无法为外部范围重新绑定。这就是为什么在您理解之后new_data 仍然是[]。作用域规则在http://elixir-lang.readthedocs.org/en/latest/technical/scoping.html

中解释

【讨论】:

  • 这很有趣。谢谢你。我知道变量是不可变的。但我想如果我声明列表之前我可以重新绑定它。
  • 谢谢!我花了很长时间才弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
  • 2021-07-06
  • 2019-06-12
  • 1970-01-01
相关资源
最近更新 更多