Apa perbedaan antara tr dan gsub?

133

Saya sedang membaca dokumentasi Ruby dan bingung dengan perbedaan antara gsubdan tr. Apa perbedaan keduanya?

Manusia Timah
sumber
8
Saya menemukan pertanyaan ini karena RuboCop memberi tahu saya tentang penggunaan gsub - saya pikir jawaban di bawah ini menjelaskan jawabannya dengan baik, yang pada dasarnya adalah apa perbedaan antara gsub dan tr.
JohnK

Jawaban:

180

Menggunakan tr saat Anda ingin mengganti (menerjemahkan) satu karakter.

trcocok dengan karakter tunggal (bukan melalui ekspresi reguler), oleh karena itu karakter tidak perlu muncul dalam urutan yang sama dalam argumen string pertama. Ketika karakter ditemukan, itu diganti dengan karakter yang ditemukan pada indeks yang sama dalam argumen string kedua:

'abcde'.tr('bda', '123')
#=> "31c2e"

'abcde'.tr('bcd', '123')
#=> "a123e"

Gunakan gsubsaat Anda perlu menggunakan ekspresi reguler atau ketika Anda ingin mengganti substring yang lebih panjang:

'abcde'.gsub(/bda/, '123')
#=> "abcde"

'abcde'.gsub(/b.d/, '123')
#=> "a123e"
spickermann
sumber
48
Sedikit konteks: namanya trberarti "menerjemahkan", seperti dalam "menerjemahkan karakter", yang persis seperti apa fungsinya. Ini dinamai setelah utilitas Unix dengan nama yang sama (yang terkenal dengan nama-nama pendek dan tidak jelas).
Martin Tournoij
40
  • trhanya dapat mengganti satu karakter dengan satu karakter tetap (meskipun Anda dapat menempatkan beberapa kecocokan seperti ini dalam satu trpanggilan) tetapi cepat.
  • gsubdapat mencocokkan pola yang rumit menggunakan regex, dan mengganti dengan hasil perhitungan yang rumit, tetapi lebih lambat dari tr.
sawa
sumber
9
Itu benar. Ketika keduanya bekerja trbeberapa kali lebih cepat daripada gsub. Berikut adalah patokan tentang seberapa cepat trbisa dibandingkan gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
9

trmengembalikan salinan strdengan karakter from_strdigantikan oleh karakter yang sesuai di to_str. Jika to_strlebih pendek dari from_str, itu diisi dengan karakter terakhir untuk mempertahankan korespondensi. http://apidock.com/ruby/String/tr

gsubmengembalikan salinan strdengan semua kemunculan pola yang diganti untuk argumen kedua. Pola ini biasanya Regexp; jika diberikan sebagai String, setiap metakarakter ekspresi reguler yang dikandungnya akan ditafsirkan secara harfiah, misalnya \dakan cocok dengan serangan balik diikuti oleh d, bukan digit. http://apidock.com/ruby/String/gsub

Joel
sumber