Как присоединиться к струнам в Эликсире?

Как присоединиться к двум строкам в списке с пробелом, например:

["StringA", "StringB"]

становится

"StringA StringB"

Ответ 1

Если вы просто хотите присоединиться к произвольному списку:

"StringA" <> " " <> "StringB"

или просто используйте интерполяцию строк:

 "#{a} #{b}"

Если размер списка произвольный:

Enum.join(["StringA", "StringB"], " ")

... все приведенные выше решения вернутся

"StringA StringB"

Ответ 2

Если у вас есть произвольный список, вы можете использовать Enum.join, но если он всего за два или три, явное конкатенация строк должно быть легче читать

"StringA" <> " " <> "StringB"

Однако часто вам не нужно иметь его в виде одной строки в памяти, если вы собираетесь выводить ее, например. сеть. В этом случае может быть полезно использовать iolist (определенный тип глубокого списка), что избавит вас от копирования данных. Например,

iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok

Поскольку у вас будут такие строки как переменные где-то, используя глубокий список, вы избегаете выделения целой новой строки только для вывода ее в другом месте. Многие функции в elixir/erlang понимают iolists, поэтому вам часто не нужно будет выполнять дополнительную работу.

Ответ 3

Отвечая на полноту, вы также можете использовать Интерполяцию строк:

iex(1)> [a, b] = ["StringA", "StringB"]
iex(2)> "#{a} #{b}"
"StringA StringB"

Ответ 4

Enum.reduce будет работать тоже для вашего примера нет?

iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end) "StringB StringA"

Ответ 5

Если вы были в порядке с добавлением пробела в свой список, вы можете рассматривать его как iolist:

["StringA", " ", "StringB"] |> IO.iodata_to_binary # "StringA StringB"

Это дает вам некоторые улучшения производительности, поскольку вы не дублируете ни одну из строк в памяти.

Ответ 6

Это зависит от того, что вы пытаетесь сделать. Если вы просто пытаетесь записать новую переменную, просто используйте либо:

  • Строковая интерполяция

    a = "StringA"
    b = "StringB"
    "#{a} #{b}"
    
  • Конкатенация строк: "StringA" <> " " <> "StringB

  • Enum.join(): ["StringA", "StringB"] |> Enum.join(" ")

Однако, как упоминал Ури, можно также использовать списки IOL:

["StringA", " ", "StringB"] |> IO.iodata_to_binary

Списки IOL на самом деле будут наиболее эффективными, если вам нужно заботиться о потреблении ресурсов. У Big Nerd Ranch есть хорошая статья о повышении производительности с IOLists.

Ответ 7

Вы также можете сделать 'string A' ++ ' ' ++ 'string B'

Ответ 8

Рассмотрите возможность использования списка ввода-вывода, если у вас есть ["String1", "string2"] и вы используете в нем iolist_to_binary/1, тогда вы скопируете эти строки в новую строку. Если у вас есть список ввода-вывода, вы можете просто вывести его в большинстве случаев, и он объединит его с портом. И это главное, во время выполнения не нужно будет делать копии данных, поэтому это намного эффективнее, чем конкатенация.