Как получить элементы списка по индексу в эликсире
{status, body} = File.read("/etc/hosts")
if status == :ok do
hosts = String.split body, "\n"
hosts = Enum.map(hosts, fn(host) -> line_to_host(host) end)
else
IO.puts "error reading: /etc/hosts"
end
У меня есть следующая функция elixir, где я читаю файл /etc/hosts и пытаюсь разбить его по строкам с помощью String.split
.
Затем я просматриваю список строк хостов и вызываю line_to_host (хост) для каждого. Метод line_to_host разбивает строку на " "
, а затем я хочу установить переменную from
и to
:
def line_to_host(line) do
data = String.split line, " "
from = elem(data, 0) // doesn't work
to = elem(data, 1) // doesn't work either
%Host{from: from, to: to}
end
Я просмотрел stackoverflow, elixir docs и googled о том, как получить элемент списка по определенному индексу.
Я знаю, что есть head/tail
, но должен быть лучший способ получить элементы списка.
elem(list, index)
делает именно то, что мне нужно, но, к сожалению, он не работает с String.split
.
Как получить элементы списка/кортежа по ID в elixir
Ответы
Ответ 1
Для этого можно использовать сопоставление шаблонов:
[from, to] = String.split line, " "
Возможно, вы хотите добавить опцию parts: 2
, чтобы убедиться, что вы получите только две части в случае, если в строке больше одного места:
[from, to] = String.split line, " ", parts: 2
Существует также Enum.at/2
, который отлично работает здесь, но является унииоматическим. Проблема с Enum.at
заключается в том, что из-за реализации списка в Elixir необходимо пройти весь список до запрошенного индекса, чтобы он мог быть очень неэффективным для больших списков.
Изменить: здесь запрошенный пример с Enum.at
, но я бы не использовал его в этом случае
parts = String.split line, " "
from = Enum.at(parts, 0)
to = Enum.at(parts, 1)