Comment joindre deux chaînes dans une liste avec un espace, comme:
["StringA", "StringB"]
devient
"StringA StringB"
Si vous souhaitez simplement 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 reviendront
"StringA StringB"
["StringA", "StringB"] |> Enum.join " "
Si ce que vous avez est une liste arbitraire, vous pouvez l'utiliser
Enum.join
, mais si c'est pour seulement deux ou trois, la concaténation de chaînes explicite devrait être plus facile à lireCependant, souvent vous n'avez pas besoin de l'avoir sous forme de chaîne unique en mémoire si vous voulez le sortir par exemple via le réseau. Dans ce cas, il peut être avantageux d'utiliser une liste iolist (un type spécifique de liste détaillée), qui vous évite de copier des données. Par exemple,
Puisque vous auriez ces chaînes en tant que variables quelque part, en utilisant une liste complète, vous évitez d'allouer une toute nouvelle chaîne juste pour la sortir ailleurs. De nombreuses fonctions dans elixir / erlang comprennent les iolists, vous n'avez donc souvent pas besoin de faire le travail supplémentaire.
la source
En réponse à l'exhaustivité, vous pouvez également utiliser l' interpolation de chaîne :
la source
Si vous êtes d'accord pour ajouter un espace dans votre liste, vous pouvez le traiter comme une iolist:
Cela vous donne des améliorations de performances car vous ne dupliquez aucune des chaînes en mémoire.
la source
Un Enum.reduce fonctionnerait aussi pour votre exemple non?
iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end)
"StringB StringA"
la source
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
Concatentation de chaînes:
"StringA" <> " " <> "StringB
Enum.join()
:["StringA", "StringB"] |> Enum.join(" ")
Cependant, comme Uri l'a mentionné, les LIO peuvent également être utilisées:
["StringA", " ", "StringB"] |> IO.iodata_to_binary
Les LIO seront en fait les plus performants si vous devez vous soucier de la consommation des ressources. Big Nerd Ranch a une bonne description des gains de performance avec les IOLists.
la source
Il existe un certain nombre de méthodes, mais savoir comment il gère les valeurs nulles peut déterminer la méthode à choisir.
Cela lancera une erreur
Cela insérera simplement une chaîne vide "":
De même que ceci:
Considérez également les types. Avec
<>
vous ne recevez aucun casting gratuit:Les performances en pratique semblent à peu près les mêmes:
Donc, cela dépend vraiment si vous voulez planter ou non lorsque les valeurs interpolées sont
nil
ou du mauvais type.la source
Tu pourrais aussi faire
'string A' ++ ' ' ++ 'string B'
la source
Pensez à utiliser une liste IO, si vous avez ["String1", "string2"] et que vous utilisez iolist_to_binary / 1 dessus, vous copiez ces chaînes dans une nouvelle chaîne. Si vous avez une liste d'E / S, vous pouvez simplement la sortir dans la plupart des cas et elle la concaténera sur le port. Et c'est la chose clé, le runtime n'aura pas besoin de faire des copies des données donc c'est beaucoup plus efficace que la concaténation.
la source