Jak połączyć dwa ciągi na liście spacją, na przykład:
["StringA", "StringB"]
staje się
"StringA StringB"
Jeśli chcesz tylko dołączyć do dowolnej listy:
"StringA" <> " " <> "StringB"
lub po prostu użyj interpolacji ciągów:
"#{a} #{b}"
Jeśli rozmiar listy jest dowolny:
Enum.join(["StringA", "StringB"], " ")
... wszystkie powyższe rozwiązania powrócą
"StringA StringB"
["StringA", "StringB"] |> Enum.join " "
Jeśli masz dowolną listę, możesz użyć
Enum.join
, ale jeśli jest to tylko dwie lub trzy, jawna konkatenacja ciągów powinna być łatwiejsza do odczytaniaJednak często nie musisz mieć tego w pamięci jako pojedynczego ciągu, jeśli chcesz wyprowadzić go np. Przez sieć. W takim przypadku może być korzystne użycie iolist (szczególny rodzaj głębokiej listy), który chroni Cię przed kopiowaniem danych. Na przykład,
Ponieważ masz gdzieś te ciągi jako zmienne, używając głębokiej listy, unikasz przydzielania całego nowego ciągu tylko po to, aby wyprowadzić go gdzie indziej. Wiele funkcji w elixir / erlang obsługuje iolists, więc często nie trzeba wykonywać dodatkowej pracy.
źródło
Odpowiadając za kompletność, możesz również użyć interpolacji ciągów :
źródło
Jeśli nie przeszkadzało Ci dodanie spacji do listy, możesz traktować ją jako iolistę:
Daje to pewne zwiększenie wydajności, ponieważ nie duplikujesz żadnego ze strun w pamięci.
źródło
Enum.reduce też by działało na twój przykład, nie?
iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end)
"StringB StringA"
źródło
To zależy od tego, co próbujesz zrobić. Jeśli po prostu próbujesz napisać do nowej zmiennej, po prostu użyj:
Interpolacja ciągów
Konkatentacja ciągów:
"StringA" <> " " <> "StringB
Enum.join()
:["StringA", "StringB"] |> Enum.join(" ")
Jednak, jak wspomniał Uri, IOLists mogą być również używane:
["StringA", " ", "StringB"] |> IO.iodata_to_binary
IOList faktycznie będą najbardziej wydajne, jeśli musisz dbać o zużycie zasobów. Big Nerd Ranch ma dobry opis wzrostu wydajności z IOListami.
źródło
Istnieje wiele metod, ale wiedza o tym, jak obsługuje ona wartości zerowe, może określić, którą metodę należy wybrać.
Spowoduje to wyświetlenie błędu
Spowoduje to wstawienie pustego ciągu „”:
Podobnie jak to:
Weź również pod uwagę typy. Z
<>
tobą nie dostaniesz żadnego darmowego odlewania:Wydajność w praktyce wydaje się mniej więcej taka sama:
Tak naprawdę zależy od tego, czy chcesz się zawiesić, czy nie, gdy interpolowane wartości są
nil
lub są niewłaściwego typu.źródło
Ty też możesz to zrobić
'string A' ++ ' ' ++ 'string B'
źródło
Rozważ użycie listy we / wy, jeśli masz ["String1", "string2"] i używasz na niej iolist_to_binary / 1, skopiujesz te ciągi do nowego łańcucha. Jeśli masz listę IO, możesz ją po prostu wyprowadzić w większości przypadków, a ona połączy ją na porcie. I to jest kluczowa rzecz, środowisko wykonawcze nie będzie musiało kopiować danych, więc jest znacznie bardziej wydajne niż konkatenacja.
źródło