Эликсир: клонировать список идиоматически - PullRequest
0 голосов
/ 04 апреля 2019

Я всегда могу сделать что-то вроде этого:

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

Существует, конечно, еще дюжина более или менее уродливых способов сделать это. Почему-то я не могу найти идиоматический способ копирования списка. Там, безусловно, должен быть способ.

Ответы [ 2 ]

7 голосов
/ 04 апреля 2019

Эликсир является неизменным языком, поэтому идиоматический способ таков:

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 голос
/ 04 апреля 2019

Поскольку структуры данных в Elixir неизменны, я не могу представить себе причину, по которой вам когда-либо понадобится «клонировать» список. Это ничего не сделает. При этом, если вы ищете способ ничего не делать, вы можете достичь Enum.to_list/1.

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