эликсир заполнить список для цикла - PullRequest
1 голос
/ 23 января 2020

Я хотел заполнить список с -l oop. Я проверял этот пост здесь , в котором есть причина, почему приведенный ниже код не будет этого делать, но тогда каким будет мой код для его достижения. Я новичок ie в эликсире и из Java фона

old_data = ['a','b','c','d']
new_data = []
for data <- old_data do
  new_data = List.insert_at(new_data, -1, data)
  IO.puts(new_data)
end
IO.puts(old_data)
IO.puts("new data is #{new_data}.")

Мне нужно сделать несколько манипуляций перед добавлением элементов в new_data, поэтому new_data = old_data - это не то, что я ищу

Ответы [ 2 ]

5 голосов
/ 23 января 2020

Эликсир является (в отличие от Java) неизменным. Тем не менее, один не может изменить какие-либо данные на месте. Также нет для l oop. Там вообще нет петель. Kernel.SpecialForms.for/1 - это понимание .

Тем не менее, если вы хотите создать новый список, вы должны сделать это явно. К сожалению, это невозможно с Kernel.SpecialForms.for/1. Для этого мы обычно используем рекурсию.

defmodule Reverser do
  def go(input, output \\ [])                  # header
  def go([], output), do: Enum.reverse(output) # termination
  def go([h | t], output), do: go(t, [h | output])
end

Reverser.go([1, 2, 3])
#⇒ [1, 2, 3]

Кроме того, здесь мы используем Enum.reverse/1 при завершении, потому что мы добавили к списку во время рекурсии, что более быстрый подход по сравнению с добавлением для связанных списков.


Sidenote: IO.puts/1 вывод может быть запутанным, используйте IO.inspect/3 вместо:

IO.inspect([1, 2, 3], label: "List")
#⇒ List: [1, 2, 3]

Sidenote # 2: ['a','b','c','d'] - список списков . Если вы хотите список символов / строк, используйте двойные кавычки . Да, значение одинарных и двойных кавычек кардинально отличается.

is_list('a')
#⇒ true
'a' == [97]
#⇒ true
3 голосов
/ 23 января 2020

Алексей упомянул хорошую отправную точку, однако, как только вы узнаете, как работают рекурсии, вы можете сделать свой код чище, используя Enum такие функции, как Enum.map/2, конечно же зависит от ситуации:

old_data = ['a','b','c','d']
Enum.map(old_data, fn _el -> -1 end)
#⇒ [-1, -1, -1, -1]
...