Saya mencari cara yang lebih elegan untuk menggabungkan string di Ruby.
Saya memiliki baris berikut:
source = "#{ROOT_DIR}/" << project << "/App.config"
Apakah ada cara yang lebih baik untuk melakukan ini?
Dan untuk apa perbedaan antara <<
dan +
?
ruby
string-concatenation
dagda1
sumber
sumber
Jawaban:
Anda dapat melakukannya dengan beberapa cara:
<<
tetapi itu bukan cara yang biasaDengan interpolasi string
dengan
+
Metode kedua tampaknya lebih efisien dalam hal memori / kecepatan dari apa yang saya lihat (meskipun tidak diukur). Ketiga metode ini akan menampilkan kesalahan konstan yang tidak diinisialisasi ketika ROOT_DIR nihil.
Saat berurusan dengan nama path, Anda mungkin ingin menggunakan
File.join
untuk menghindari mengacaukan pemisah pathname.Pada akhirnya, ini adalah masalah selera.
sumber
The
+
operator adalah pilihan Rangkaian normal, dan mungkin adalah cara tercepat untuk string concatenate.Perbedaan antara
+
dan<<
adalah yang<<
mengubah objek di sisi kiri, dan+
tidak.sumber
+
dan<<
akan hampir sama. Jika Anda berurusan dengan banyak string, atau string yang sangat besar, maka Anda mungkin melihat perbedaannya. Saya terkejut dengan betapa miripnya mereka tampil. gist.github.com/28953115.times do ... end
blok) untuk setiap penerjemah, Anda akan mendapatkan hasil yang lebih akurat. Pengujian saya menunjukkan interpolasi adalah metode tercepat, di semua penafsir Ruby. Saya berharap<<
menjadi yang tercepat, tapi itu sebabnya kami melakukan benchmark.Jika Anda baru saja menyatukan jalur, Anda dapat menggunakan metode File.join milik Ruby sendiri.
sumber
dari http://greyblake.com/blog/2012/09/02/ruby-perfomance-tricks/
Menggunakan
<<
aliasconcat
jauh lebih efisien daripada+=
, karena yang terakhir menciptakan objek temporal dan menimpa objek pertama dengan objek baru.keluaran:
sumber
Karena ini adalah jalur, saya mungkin akan menggunakan array dan bergabung:
sumber
Berikut patokan lain yang terinspirasi oleh intisari ini . Ini membandingkan concatenation (
+
), appending (<<
) dan interpolasi (#{}
) untuk string dinamis dan yang telah ditentukan.keluaran:
Kesimpulan: interpolasi dalam MRI berat.
sumber
Saya lebih suka menggunakan Pathname:
tentang
<<
dan+
dari ruby docs:+
: Mengembalikan String baru yang berisi other_str yang digabungkan ke str<<
: Menggabungkan objek yang diberikan ke str. Jika objek adalah Fixnum antara 0 dan 255, itu dikonversi ke karakter sebelum penggabungan.jadi perbedaannya adalah apa yang menjadi operan pertama (
<<
membuat perubahan di tempat,+
mengembalikan string baru sehingga memori lebih berat) dan apa yang akan terjadi jika operan pertama adalah Fixnum (<<
akan menambahkan seolah-olah itu karakter dengan kode yang sama dengan angka itu,+
akan menaikkan kesalahan)sumber
Pathname('/home/foo') + '/etc/passwd' # => #<Pathname:/etc/passwd>
. Ini dengan desain, berdasarkan contoh rubydoc. Tampaknya File.join lebih aman.(Pathname(ROOT_DIR) + project + 'App.config').to_s
jika ingin mengembalikan objek string.Biarkan saya menunjukkan kepada Anda semua pengalaman saya dengan itu.
Saya memiliki permintaan yang mengembalikan 32 ribu catatan, untuk setiap catatan saya memanggil metode untuk memformat catatan basis data itu menjadi string yang diformat dan kemudian menggabungkannya menjadi String yang pada akhir semua proses ini akan berubah menjadi file dalam disk.
Masalah saya adalah bahwa dengan catatan berjalan, sekitar 24rb, proses menyatukan String menjadi sangat menyakitkan.
Saya melakukan itu menggunakan operator '+' biasa.
Ketika saya berubah ke '<<' itu seperti sihir. Sangat cepat.
Jadi, saya ingat masa lalu saya - semacam 1998 - ketika saya menggunakan Java dan menyatukan String menggunakan '+' dan berubah dari String ke StringBuffer (dan sekarang kami, pengembang Java memiliki StringBuilder).
Saya percaya bahwa proses + / << di dunia Ruby sama dengan + / StringBuilder.append di dunia Java.
Yang pertama realokasi seluruh objek dalam memori dan yang lainnya hanya menunjuk ke alamat baru.
sumber
Katanya konkatasi? Bagaimana dengan
#concat
metode itu?Dalam semua keadilan,
concat
alias<<
.sumber
"foo" "bar" 'baz" #=> "foobarabaz"
Berikut ini lebih banyak cara untuk melakukan ini:
Dan seterusnya ...
sumber
Anda juga dapat menggunakan
%
sebagai berikut:Pendekatan ini bekerja dengan
'
tanda kutip (tunggal) juga.sumber
Anda dapat menggunakan
+
atau<<
operator, tetapi dalam.concat
fungsi ruby adalah yang paling disukai, karena jauh lebih cepat daripada operator lain. Anda bisa menggunakannya seperti.sumber
.
setelahconcat
no terakhir Anda ?Situasi penting, misalnya:
Dalam contoh pertama, menggabungkan dengan
+
operator tidak akan memperbaruioutput
objek, namun, dalam contoh kedua,<<
operator akan memperbaruioutput
objek dengan setiap iterasi. Jadi, untuk jenis situasi di atas,<<
lebih baik.sumber
Anda dapat menggabungkan dalam definisi string secara langsung:
sumber
Untuk kasus khusus Anda, Anda juga dapat menggunakan
Array#join
ketika membangun tipe jalur file string:Ini memiliki efek samping yang menyenangkan dengan secara otomatis mengonversi berbagai jenis menjadi string:
sumber
Untuk boneka:
sumber