Как увеличить, регистр конкретной буквы в массиве Elixir

Может, для кого-то покажется глупый вопрос, но меня интересует как увеличить, не все буквы в массиве, а конкретную. Я попытался сделать свой код, но пока не удачно

x=["zoo", "sv", "xoo", "gis"]
z=Enum.map(x, fn item -> String.upcase(item[1]=item[1]) end)
IO.puts Enum.join(z, " ")    Вот что хотел получить: `zOo sV xOo gIs`

Ответы (1 шт):

Автор решения: Alexandr Sysoev

String.upcase/2 не поддерживает подобные структуры в качестве параметра (Документация).


Одно из наивных решений может выглядеть так:

["zoo", "sv", "xoo", "gis"]
|> Enum.map(fn string ->
  string
  |> String.split("", trim: true)
  |> List.update_at(1, &String.upcase/1)
  |> Enum.join()
end)

Мы разбиваем каждую строчку на посимвольный лист, затем в каждом листе обновляем второй элемент и снова собираем лист в одну строчку.


Можно решить данную задачу изящнее, используя pattern matching

["zoo", "sv", "xoo", "gis"]
|> Enum.map(fn string ->
  <<first_letter, second_letter>> <> tail = string
  <<first_letter>> <> String.upcase(<<second_letter>>) <> tail
end)
→ Ссылка