Ruby dizeleri veya sembolleri için dizi eşitliğini (nesne eşitliğini değil) test etmenin en kısa yolu?


87

Ruby'de dize eşitliğini test etmek için her zaman bunu yapıyorum:

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

Nesne eşitliğini test etmeden bunu yapmanın doğru yolu bu mu?

Dizeleri içeriklerine göre test etmenin en kısa yolunu arıyorum.

Parantez ve soru işaretiyle bu biraz hantal görünüyor.

Yanıtlar:



15

Kod örneğiniz, konunuzun bir kısmında, yani sembollerde genişlemedi ve bu nedenle sorunun bu kısmı cevapsız kaldı.

İki dizeniz (foo ve bar) varsa ve her ikisi de bir dize veya sembol olabilir, eşitliği şu şekilde test edebilirsiniz:

foo.to_s == bar.to_s

Bilinen türe sahip işlenenler üzerinde dizi dönüşümlerini atlamak biraz daha etkilidir. Yani eğer foo her zaman bir dizeyse

foo == bar.to_s

Ancak verimlilik kazancı, neredeyse kesinlikle, arayan adına herhangi bir ekstra çalışma talep etmeye değmez.

Ruby 2.2'den önce, karşılaştırma amacıyla (dizeler veya sembollerle) kontrolsüz girdi dizgilerini dahil etmekten kaçının, çünkü semboller çöp olarak toplanmaz ve böylece kendinizi kaynakların tükenmesi yoluyla hizmet reddine açabilirsiniz. Sembol kullanımınızı kontrol ettiğiniz değerlerle, yani kodunuzdaki değişmez değerlerle ve güvenilir yapılandırma özellikleriyle sınırlayın.

Ruby 2.2 , sembollerin çöp koleksiyonunu tanıttı .


6
foo.intern == bar.interndaha iyi olurdu - bir dizgeyi incelemek ortalama olarak bir sembolden bir dizi oluşturmaktan daha etkilidir. (Belirli bir dizge daha önce gözaltına alınmışsa, sadece sembolü döndürür.)
Chuck

4
Aslında, bazı karşılaştırmalardan biraz tasarruf etmek için bir dizeden bir sembol yaratmanın iyi bir fikir olduğunu düşünmüyorum, çünkü dizge uyuşmazsa semboller sızdıracaktır. Semboller çöp olarak toplanmaz ve bu nedenle onları tutmak istemiyorsanız oluşturulmamalıdır, aksi takdirde hizmet reddi saldırısı için bir vektör oluşturursunuz.
patru

Tanrım, bunu düşünmemiştim. Teşekkürler, cevabımı yorumunuza göre değiştirdim.
sheldonh

1
Bunun yeniden ifade edilmesi gerekiyor: "Kontrolsüz girdi dizelerini [...] iç içe geçirmekten kaçının çünkü semboller çöp olarak toplanmaz". Teşekkür ederim @sheldonh.
Nate
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.