Мне нужно вернуть элемент из списка, который находится рядом с элементом, указанным в аргументе.
Есть много способов сделать это. Во-первых, идиоматическое решение, использующее сопоставление с образцом:
def first([a, b | _], a), do: b
def first([_, b | c], d), do: first([b | c], d)
def first([]), do: nil
Это рекурсивно проверяет, соответствует ли первый элемент аргументу, и если да, возвращает следующий.
Вот более прямой перевод вашего алгоритма:
def second(list, x) do
case Enum.find_index(list, &(&1 == x)) do
nil -> nil
i -> Enum.at(list, i + 1)
end
end
Тест:
list = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
IO.inspect A.first(list, "d")
IO.inspect A.second(list, "d")
Выход:
"e"
"e"