Как присоединиться к двум строкам в списке с пробелом, например:
["StringA", "StringB"]
становится
"StringA StringB"
Как присоединиться к двум строкам в списке с пробелом, например:
["StringA", "StringB"]
становится
"StringA StringB"
Если вы просто хотите присоединиться к произвольному списку:
"StringA" <> " " <> "StringB"
или просто используйте интерполяцию строк:
"#{a} #{b}"
Если размер списка произвольный:
Enum.join(["StringA", "StringB"], " ")
... все приведенные выше решения вернутся
"StringA StringB"
Если у вас есть произвольный список, вы можете использовать Enum.join
, но если он всего за два или три, явное конкатенация строк должно быть легче читать
"StringA" <> " " <> "StringB"
Однако часто вам не нужно иметь его в виде одной строки в памяти, если вы собираетесь выводить ее, например. сеть. В этом случае может быть полезно использовать iolist (определенный тип глубокого списка), что избавит вас от копирования данных. Например,
iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok
Поскольку у вас будут такие строки как переменные где-то, используя глубокий список, вы избегаете выделения целой новой строки только для вывода ее в другом месте. Многие функции в elixir/erlang понимают iolists, поэтому вам часто не нужно будет выполнять дополнительную работу.
Отвечая на полноту, вы также можете использовать Интерполяцию строк:
iex(1)> [a, b] = ["StringA", "StringB"]
iex(2)> "#{a} #{b}"
"StringA StringB"
Enum.reduce будет работать тоже для вашего примера нет?
iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end)
"StringB StringA"
Если вы были в порядке с добавлением пробела в свой список, вы можете рассматривать его как iolist:
["StringA", " ", "StringB"] |> IO.iodata_to_binary # "StringA StringB"
Это дает вам некоторые улучшения производительности, поскольку вы не дублируете ни одну из строк в памяти.
Это зависит от того, что вы пытаетесь сделать. Если вы просто пытаетесь записать новую переменную, просто используйте либо:
Строковая интерполяция
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.
Вы также можете сделать 'string A' ++ ' ' ++ 'string B'
Рассмотрите возможность использования списка ввода-вывода, если у вас есть ["String1", "string2"] и вы используете в нем iolist_to_binary/1, тогда вы скопируете эти строки в новую строку. Если у вас есть список ввода-вывода, вы можете просто вывести его в большинстве случаев, и он объединит его с портом. И это главное, во время выполнения не нужно будет делать копии данных, поэтому это намного эффективнее, чем конкатенация.