Comment puis-je joindre deux chaînes dans une liste avec un espace, comme:
["StringA", "StringB"]
devient
"StringA StringB"
Si vous voulez juste rejoindre une liste arbitraire:
"StringA" <> " " <> "StringB"
ou utilisez simplement l'interpolation de chaîne:
"#{a} #{b}"
Si la taille de votre liste est arbitraire:
Enum.join(["StringA", "StringB"], " ")
... toutes les solutions ci-dessus vont revenir
"StringA StringB"
Si ce que vous avez est une liste arbitraire, vous pouvez utiliser Enum.join
, mais s'il ne s'agit que de deux ou trois, la concaténation de chaînes explicites devrait être plus facile à lire.
"StringA" <> " " <> "StringB"
Cependant, vous n'avez souvent pas besoin de l'avoir sous la forme d'une seule chaîne en mémoire si vous voulez l'exporter, par exemple. le réseau. Dans ce cas, il peut être avantageux d’utiliser une liste (un type spécifique de liste détaillée), qui vous évite de copier des données. Par exemple,
iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok
Etant donné que vous auriez ces chaînes en tant que variables quelque part, en utilisant une liste détaillée, vous évitez d'allouer une nouvelle chaîne simplement pour la sortir ailleurs. De nombreuses fonctions dans elixir/erlang comprennent les spécialistes de la téléphonie, vous n'avez donc souvent pas besoin de faire le travail supplémentaire.
Répondant pour être complet, vous pouvez également utiliser Interpolation de chaîne :
iex(1)> [a, b] = ["StringA", "StringB"]
iex(2)> "#{a} #{b}"
"StringA StringB"
Un Enum.reduce fonctionnerait aussi pour votre exemple non?
iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end)
"StringB StringA"
Si vous pouviez ajouter un espace dans votre liste, vous pourriez le traiter comme un iolist:
["StringA", " ", "StringB"] |> IO.iodata_to_binary # "StringA StringB"
Cela vous donne un coup de fouet car vous ne dupliquez aucune des chaînes en mémoire.
Cela dépend de ce que vous essayez de faire. Si vous essayez simplement d'écrire dans une nouvelle variable, utilisez simplement soit:
Interpolation de chaîne
a = "StringA"
b = "StringB"
"#{a} #{b}"
Concaténation de chaîne: "StringA" <> " " <> "StringB
Enum.join()
: ["StringA", "StringB"] |> Enum.join(" ")
Cependant, comme Uri l’a mentionné, les IOListes peuvent également être utilisés:
["StringA", " ", "StringB"] |> IO.iodata_to_binary
En réalité, les IOListes seront les plus performants si vous devez vous préoccuper de la consommation de ressources. Big Nerd Ranch a une bonne rédaction sur les gains de performance avec les IOListes.
Pensez à utiliser une liste IO, si vous avez ["String1", "string2"] et que vous utilisez iolist_to_binary/1, vous copiez ces chaînes dans une nouvelle chaîne. Si vous avez une liste IO, vous pouvez simplement la sortir dans la plupart des cas et la concaténer sur le port. Et c’est l’essentiel, le moteur d’exécution n’aura pas besoin de copier les données, ce qui est beaucoup plus efficace que la concaténation.
Vous pouvez aussi faire 'string A' ++ ' ' ++ 'string B'