web-dev-qa-db-ja.com

Elixirで文字列を結合する方法は?

リスト内の2つの文字列をスペースで結合するには、次のようにします。

["StringA", "StringB"]

になる

"StringA StringB"
131
thiagofm

任意のリストに参加したいだけの場合:

"StringA" <> " " <> "StringB"

または単に文字列補間を使用します:

 "#{a} #{b}"

リストのサイズが任意の場合:

Enum.join(["StringA", "StringB"], " ")

...上記のすべてのソリューションが返されます

"StringA StringB"
193
thiagofm

持っているものが任意のリストである場合は、Enum.joinを使用できますが、2つまたは3つだけの場合は、明示的な文字列の連結が読みやすいはずです。

"StringA" <> " " <> "StringB"

ただし、多くの場合、メモリを通じて単一の文字列として出力する必要はありません。ネットワーク。その場合、iolist(ディープリストの特定の種類)を使用するとデータをコピーする必要がなくなります。例えば、

iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok

深いリストを使用することで、これらの文字列を変数としてどこかに持っているので、まったく別の場所に出力するためにまったく新しい文字列を割り当てることを避けます。 elixir/erlangの多くの関数はiolistを理解するため、多くの場合、余分な作業を行う必要はありません。

58

完全を期すために、文字列補間を使用することもできます。

iex(1)> [a, b] = ["StringA", "StringB"]
iex(2)> "#{a} #{b}"
"StringA StringB"
9
Sheharyar

あなたの例では、Enum.reduceも機能しますか?

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

5
Low Kian Seong

リストにスペースを追加しても問題ない場合は、iolistとして扱うことができます。

["StringA", " ", "StringB"] |> IO.iodata_to_binary # "StringA StringB"

これにより、メモリ内の文字列を複製しないため、パフォーマンスが向上します。

4
Uri

それはあなたが何をしようとしているかに依存します。新しい変数に書き込もうとしている場合は、次のいずれかを使用します。

  • 文字列補間

    a = "StringA"
    b = "StringB"
    "#{a} #{b}"
    
  • 文字列の連結:"StringA" <> " " <> "StringB

  • Enum.join()["StringA", "StringB"] |> Enum.join(" ")

ただし、Uriが述べたように、IOListsも使用できます。

["StringA", " ", "StringB"] |> IO.iodata_to_binary

リソース消費を気にする必要がある場合、実際にはIOListが最もパフォーマンスが高くなります。 Big Nerd Ranchには、IOListを使用したパフォーマンスの向上に関する 良い評価 があります。

3

IOリストの使用を検討してください。["String1"、 "string2"]があり、iolist_to_binary/1を使用している場合、それらの文字列を新しい文字列にコピーします。 IOリストがある場合、ほとんどの場合それを出力することができ、ポートで連結します。これが重要です。ランタイムはデータのコピーを作成する必要がないため、連結よりもはるかに効率的です。

0
Zachary K

'string A' ++ ' ' ++ 'string B'もできます

0
Vatsala