Elixir:惯用地克隆列表

时间:2019-04-04 13:43:13

标签: list copy elixir

我总是可以做这样的事情:

new_list = Enum.map(old_list, fn x -> x end)

当然,还有更多的同样或更丑陋的方法。不知何故,我找不到复制列表的惯用方式。当然一定有办法。

2 个答案:

答案 0 :(得分:7)

长生不老药是一门不变的语言,所以惯用的方式是这样的:

clone = original

没有必要“克隆”。分配给现有变量的数据无法编辑,因此从概念上将一个变量分配给另一个变量将得到数据的副本。您无法编辑现有数据-如果您重新分配给现有变量,则从概念上讲就是将该变量指向新的数据结构。

original = [1, 2, 3] |> IO.inspect(label: "original")
clone = original |> IO.inspect(label: "clone")
prepended = [0 | original] |> IO.inspect(label: "prepended")
original |> IO.inspect(label: "original again")
original = [5, 6, 7] |> IO.inspect(label: "original rebound")
clone |> IO.inspect(label: "clone again")

输出:

original: [1, 2, 3]
clone: [1, 2, 3]
prepended: [0, 1, 2, 3]
original again: [1, 2, 3]
original rebound: [5, 6, 7]
clone again: [1, 2, 3]

答案 1 :(得分:1)

由于Elixir中的数据结构是不可变的,所以我想不出您需要“克隆”列表的原因。它什么也不会做。话虽这么说,如果您正在寻找一种方法来完全不进行任何操作,则可以达到Enum.to_list/1

iex> Enum.to_list([1, 2, 3])
[1, 2, 3]