Cara paling ringkas untuk menguji persamaan string (bukan persamaan objek) untuk string atau simbol Ruby?

87

Saya selalu melakukan ini untuk menguji kesetaraan string di Ruby:

if mystring.eql?(yourstring)
 puts "same"
else
 puts "different"
end

Apakah ini cara yang benar untuk melakukan ini tanpa menguji persamaan objek?

Saya mencari cara paling ringkas untuk menguji string berdasarkan kontennya.

Dengan tanda kurung dan tanda tanya, ini tampak sedikit kikuk.

Bryan Locke
sumber

Jawaban:

15

Contoh kode Anda tidak berkembang pada bagian dari topik Anda, yaitu simbol, sehingga bagian dari pertanyaan itu tidak terjawab.

Jika Anda memiliki dua string, foo dan bar, dan keduanya dapat berupa string atau simbol, Anda dapat menguji kesetaraan dengan

foo.to_s == bar.to_s

Sedikit lebih efisien untuk melewati konversi string pada operan dengan tipe yang diketahui. Jadi jika foo selalu berupa string

foo == bar.to_s

Tetapi perolehan efisiensi hampir pasti tidak layak menuntut pekerjaan ekstra atas nama penelepon.

Sebelum menggunakan Ruby 2.2, hindari memasukkan string input yang tidak terkontrol untuk tujuan perbandingan (dengan string atau simbol), karena simbol tidak dikumpulkan dari sampah, sehingga Anda dapat membuka diri terhadap penolakan layanan melalui kehabisan resource. Batasi penggunaan simbol untuk nilai yang Anda kontrol, yaitu literal dalam kode Anda, dan properti konfigurasi tepercaya.

Ruby 2.2 memperkenalkan pengumpulan sampah simbol .

sheldonh.dll
sumber
6
foo.intern == bar.internakan lebih baik - menyimpan string rata-rata lebih efisien daripada membuat string dari simbol. (Jika string yang diberikan sebelumnya telah diinternir, itu hanya mengembalikan simbolnya.)
Chuck
4
Sebenarnya menurut saya bukan ide yang baik untuk membuat simbol dari string hanya untuk menghemat sedikit pada beberapa perbandingan karena akan membocorkan simbol jika string tidak cocok. Simbol tidak dikumpulkan sampah dan oleh karena itu tidak boleh dibuat jika Anda tidak bermaksud menyimpannya, jika tidak, Anda membuat vektor untuk serangan penolakan layanan.
Patru
Wah, saya tidak memikirkan itu. Terima kasih, saya telah mengubah jawaban saya berdasarkan komentar Anda.
sheldonh
1
Ini perlu dinyatakan kembali: "Hindari memasukkan string input yang tidak terkontrol [...] karena simbol tidak dikumpulkan dari sampah". Terima kasih @sheldonh.
Nate