Зразок коду не розширив частину вашої теми, а саме символи, і тому частина запитання залишилась без відповіді.
Якщо у вас є два рядки, foo і bar, і обидва можуть бути рядком або символом, ви можете перевірити рівність за допомогою
foo.to_s == bar.to_s
Трохи ефективніше пропускати перетворення рядків на операнди з відомим типом. Отже, якщо foo - це завжди рядок
foo == bar.to_s
Але підвищення ефективності майже напевно не варто вимагати додаткової роботи від імені абонента.
До Ruby 2.2 уникайте інтернінгу неконтрольованих вхідних рядків з метою порівняння (з рядками або символами), оскільки символи не є зібраним сміттям, і тому ви можете відкрити себе до відмови в обслуговуванні через вичерпання ресурсів. Обмежте використання символів значеннями, якими ви керуєте, тобто літералами у коді та надійними властивостями конфігурації.
Ruby 2.2 представив збір сміття символів .
foo.intern == bar.intern
було б краще - інтернування рядка в середньому ефективніше, ніж створення рядка із символу. (Якщо заданий рядок раніше був інтернований, він просто повертає символ.)