Найкоротший спосіб перевірити рівність рядків (а не рівність об’єктів) для рядків або символів Ruby?


86

Я завжди роблю це, щоб перевірити рівність рядків у Ruby:

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

Чи це правильний спосіб зробити це без перевірки рівності об’єкта?

Я шукаю найбільш стислий спосіб тестування рядків на основі їх змісту.

З дужками та знаком питання це здається трохи незграбним.

Відповіді:



14

Зразок коду не розширив частину вашої теми, а саме символи, і тому частина запитання залишилась без відповіді.

Якщо у вас є два рядки, foo і bar, і обидва можуть бути рядком або символом, ви можете перевірити рівність за допомогою

foo.to_s == bar.to_s

Трохи ефективніше пропускати перетворення рядків на операнди з відомим типом. Отже, якщо foo - це завжди рядок

foo == bar.to_s

Але підвищення ефективності майже напевно не варто вимагати додаткової роботи від імені абонента.

До Ruby 2.2 уникайте інтернінгу неконтрольованих вхідних рядків з метою порівняння (з рядками або символами), оскільки символи не є зібраним сміттям, і тому ви можете відкрити себе до відмови в обслуговуванні через вичерпання ресурсів. Обмежте використання символів значеннями, якими ви керуєте, тобто літералами у коді та надійними властивостями конфігурації.

Ruby 2.2 представив збір сміття символів .


6
foo.intern == bar.internбуло б краще - інтернування рядка в середньому ефективніше, ніж створення рядка із символу. (Якщо заданий рядок раніше був інтернований, він просто повертає символ.)
Чак

4
Насправді я не думаю, що це гарна ідея створювати символ із рядка, щоб лише трохи заощадити на деяких порівняннях, оскільки він буде витікати із символів, якщо рядок не відповідає. Символи не є зібраним сміттям, тому їх не слід створювати, якщо ви не збираєтеся їх зберігати, інакше ви створюєте вектор для атаки відмови в обслуговуванні.
Патру

Гей, я про це не думав. Дякую, я змінив свою відповідь на основі вашого коментаря.
sheldonh

1
Це потрібно переглянути: "Уникайте інтернінгу неконтрольованих вхідних рядків [...], оскільки символи не є зібраним сміттям". Дякую @sheldonh.
Nate
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.