В вашем примере кода не была расширена часть вашей темы, а именно символы, поэтому эта часть вопроса осталась без ответа.
Если у вас есть две строки, foo и bar, и обе могут быть строкой или символом, вы можете проверить равенство с помощью
foo.to_s == bar.to_s
Немного эффективнее пропустить преобразование строк в операндах с известным типом. Итак, если foo всегда является строкой
foo == bar.to_s
Но для повышения эффективности почти наверняка не стоит требовать от вызывающего абонента дополнительной работы.
До Ruby 2.2 избегайте интернирования неконтролируемых входных строк с целью сравнения (со строками или символами), потому что символы не собираются сборщиком мусора, и вы можете подвергнуться отказу в обслуживании из-за исчерпания ресурсов. Ограничьте использование символов значениями, которые вы контролируете, т. Е. Литералами в коде и надежными свойствами конфигурации.
Ruby 2.2 представил сборщик мусора символов .
foo.intern == bar.intern
было бы лучше - интернирование строки в среднем более эффективно, чем создание строки из символа. (Если данная строка была ранее интернирована, она просто возвращает символ.)