Основное различие заключается в том, что несколько символов, представляющих одно значение, идентичны, тогда как для строк это не так. Например:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
3 ссылки на символ: тест, все тот же объект.
irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948
3 ссылки на строку «test», все разные объекты.
Это означает, что использование символов может потенциально сэкономить значительную часть памяти в зависимости от приложения. Также быстрее сравнивать символы на равенство, поскольку они являются одним и тем же объектом, сравнение идентичных строк выполняется намного медленнее, поскольку необходимо сравнивать значения строк, а не только идентификаторы объектов.
Я обычно использую строки почти для всего, кроме таких вещей, как хеш-ключи, где мне действительно нужен уникальный идентификатор, а не строка