Bagaimana cara saya menggabungkan dua string dalam daftar dengan spasi, seperti:
["StringA", "StringB"]
menjadi
"StringA StringB"
Jika Anda hanya ingin bergabung dengan beberapa daftar arbitrer:
"StringA" <> " " <> "StringB"
atau cukup gunakan interpolasi string:
"#{a} #{b}"
Jika ukuran daftar Anda arbitrer:
Enum.join(["StringA", "StringB"], " ")
... semua solusi di atas akan kembali
"StringA StringB"
["StringA", "StringB"] |> Enum.join " "
Jika yang Anda miliki adalah daftar arbitrer, maka Anda dapat menggunakannya
Enum.join
, tetapi jika hanya untuk dua atau tiga, rangkaian string eksplisit harus lebih mudah dibacaNamun, sering kali Anda tidak perlu memilikinya sebagai string tunggal dalam memori jika Anda akan mengeluarkannya melalui misalnya jaringan. Dalam hal ini, akan menguntungkan untuk menggunakan iolist (tipe spesifik dari daftar yang mendalam), yang menyelamatkan Anda dari menyalin data. Sebagai contoh,
Karena Anda akan memiliki string tersebut sebagai variabel di suatu tempat, dengan menggunakan daftar yang mendalam, Anda menghindari mengalokasikan string yang sama sekali baru hanya untuk output di tempat lain. Banyak fungsi di elixir / erlang mengerti iolists, jadi Anda seringkali tidak perlu melakukan pekerjaan ekstra.
sumber
Menjawab untuk kelengkapan, Anda juga dapat menggunakan interpolasi String :
sumber
Jika Anda baik-baik saja dengan menambahkan spasi di daftar Anda, Anda bisa memperlakukannya sebagai seorang iolist:
Ini memberi Anda beberapa peningkatan kinerja karena Anda tidak menduplikasi string dalam memori.
sumber
Sebuah Enum.reduce akan bekerja juga untuk contoh Anda, tidak?
iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end)
"StringB StringA"
sumber
Itu tergantung pada apa yang Anda coba lakukan. Jika Anda hanya mencoba menulis ke variabel baru, gunakan saja:
Interpolasi string
String concatentation:
"StringA" <> " " <> "StringB
Enum.join()
:["StringA", "StringB"] |> Enum.join(" ")
Namun, seperti yang disebutkan Uri, IOLists juga dapat digunakan:
["StringA", " ", "StringB"] |> IO.iodata_to_binary
IOLists sebenarnya akan menjadi yang paling berprestasi jika Anda perlu peduli dengan konsumsi sumber daya. Peternakan Big Nerd memiliki artikel bagus tentang peningkatan kinerja dengan IOLists.
sumber
Ada sejumlah metode, tetapi mengetahui bagaimana menangani nilai nil dapat menentukan metode mana yang harus Anda pilih.
Ini akan menimbulkan kesalahan
Ini hanya akan memasukkan string "" kosong:
Seperti ini:
Juga pertimbangkan jenis. Dengan
<>
Anda tidak mendapatkan casting gratis:Kinerja dalam praktik tampaknya kurang lebih sama:
Jadi, sangat tergantung pada apakah Anda ingin crash atau tidak ketika nilai yang diinterpolasi adalah
nil
atau tipe yang salah.sumber
Anda juga bisa melakukannya
'string A' ++ ' ' ++ 'string B'
sumber
Pertimbangkan untuk menggunakan Daftar IO, jika Anda memiliki ["String1", "string2"] dan Anda menggunakan iolist_to_binary / 1 di atasnya maka Anda akan menyalin string tersebut ke string baru. Jika Anda memiliki daftar IO, Anda bisa menampilkannya dalam banyak kasus dan akan menggabungkannya di port. Dan ini adalah kuncinya, runtime tidak perlu membuat salinan data sehingga jauh lebih efisien daripada penggabungan.
sumber