Wie verbinde ich zwei Zeichenfolgen in einer Liste mit einem Leerzeichen wie:
["StringA", "StringB"]
wird
"StringA StringB"
Wenn Sie sich nur einer beliebigen Liste anschließen möchten:
"StringA" <> " " <> "StringB"
oder verwenden Sie einfach die String-Interpolation:
"#{a} #{b}"
Wenn Ihre Listengröße beliebig ist:
Enum.join(["StringA", "StringB"], " ")
... alle oben genannten Lösungen werden zurückkehren
"StringA StringB"
["StringA", "StringB"] |> Enum.join " "
Wenn Sie eine beliebige Liste haben, können Sie diese verwenden
Enum.join
. Wenn es sich jedoch nur um zwei oder drei handelt, sollte die explizite Verkettung von Zeichenfolgen leichter zu lesen seinOft müssen Sie es jedoch nicht als einzelne Zeichenfolge im Speicher haben, wenn Sie es beispielsweise über das Netzwerk ausgeben möchten. In diesem Fall kann es vorteilhaft sein, eine Iolist (einen bestimmten Typ einer tiefen Liste) zu verwenden, die Sie vor dem Kopieren von Daten bewahrt. Beispielsweise,
Da Sie diese Zeichenfolgen irgendwo als Variablen haben würden, vermeiden Sie durch die Verwendung einer tiefen Liste, eine ganz neue Zeichenfolge zuzuweisen, nur um sie an anderer Stelle auszugeben. Viele Funktionen in elixir / erlang verstehen Iolisten, sodass Sie die zusätzliche Arbeit oft nicht erledigen müssen.
quelle
Der Vollständigkeit halber können Sie auch die String-Interpolation verwenden :
quelle
Wenn Sie ein Leerzeichen in Ihre Liste einfügen möchten, können Sie es als Iolist behandeln:
Dies gibt Ihnen einige Leistungssteigerungen, da Sie keine der Zeichenfolgen im Speicher duplizieren.
quelle
Ein Enum.reduce würde auch für Ihr Beispiel funktionieren, nein?
iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end)
"StringB StringA"
quelle
Es hängt davon ab, was Sie versuchen zu tun. Wenn Sie nur versuchen, in eine neue Variable zu schreiben, verwenden Sie einfach Folgendes:
String-Interpolation
String-Konzentration:
"StringA" <> " " <> "StringB
Enum.join()
::["StringA", "StringB"] |> Enum.join(" ")
Wie Uri erwähnte, können IOListen jedoch auch verwendet werden:
["StringA", " ", "StringB"] |> IO.iodata_to_binary
IOListen werden tatsächlich am leistungsfähigsten sein, wenn Sie sich um den Ressourcenverbrauch kümmern müssen. Die Big Nerd Ranch hat einen guten Überblick über Leistungssteigerungen mit IOListen.
quelle
Es gibt eine Reihe von Methoden, aber wenn Sie wissen, wie mit Nullwerten umgegangen wird, können Sie bestimmen, welche Methode Sie wählen sollten.
Dies wird einen Fehler auslösen
Dadurch wird nur eine leere "" Zeichenfolge eingefügt:
Wie wird das:
Berücksichtigen Sie auch Typen. Mit
<>
dir bekommst du kein Free Casting:Die Leistung in der Praxis scheint ungefähr gleich zu sein:
Kommt also wirklich darauf an, ob du abstürzen willst oder nicht, wenn die interpolierten Werte
nil
oder der falsche Typ sind.quelle
Sie könnten auch tun
'string A' ++ ' ' ++ 'string B'
quelle
Erwägen Sie die Verwendung einer E / A-Liste. Wenn Sie ["String1", "string2"] haben und iolist_to_binary / 1 verwenden, kopieren Sie diese Zeichenfolgen in eine neue Zeichenfolge. Wenn Sie eine E / A-Liste haben, können Sie diese in den meisten Fällen einfach ausgeben und sie wird am Port verkettet. Und das ist der Schlüssel, die Laufzeit muss keine Kopien der Daten erstellen, so dass es viel effizienter als die Verkettung ist.
quelle