web-dev-qa-db-fra.com

Comment rejoindre des chaînes dans Elixir?

Comment puis-je joindre deux chaînes dans une liste avec un espace, comme:

["StringA", "StringB"]

devient

"StringA StringB"
116
thiagofm

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"
172
thiagofm

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.

57

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"
9
Sheharyar

Un Enum.reduce fonctionnerait aussi pour votre exemple non?

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

5
Low Kian Seong

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.

3
Uri

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.

3

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. 

0
Zachary K

Vous pouvez aussi faire 'string A' ++ ' ' ++ 'string B'

0
Vatsala