TL; DR:
Использование символов не только экономит время при выполнении сравнений, но и экономит память, поскольку они сохраняются только один раз.
Рубиновые символы являются неизменяемыми (не могут быть изменены), что значительно упрощает поиск чего-либо
Краткий (ish) ответ:
ИспользованиеСимволы не только экономят время при выполнении сравнений, но и экономят память, потому что они сохраняются только один раз.
Символы в Ruby в основном "неизменяемые строки" ... это означает, что они не могут быть изменены, и это означает, что один и тот же символ при многократном обращении по всему исходному коду всегда сохраняется как одна и та же сущность, например, имеет один и тот же идентификатор объекта.
С другой стороны, строки являются изменяемыми , их можно изменить в любое время.Это означает, что Ruby необходимо хранить каждую строку, которую вы упоминаете в исходном коде, в отдельной сущности, например, если у вас несколько раз упоминается строка «имя» в вашем исходном коде, Ruby необходимо хранить их все в отдельных объектах String, поскольку ониможет измениться позже (такова природа строки Ruby).
Если вы используете строку в качестве ключа Hash, Ruby необходимо оценить строку и посмотреть ее содержимое (и вычислить хеш-функцию для этого)и сравните результат со значениями (хэшированными) ключей, которые уже хранятся в хэше.
Если вы используете символ в качестве ключа хэша, это подразумевает, что он неизменен, поэтому Ruby может просто выполнитьсравнение (хеш-функции) идентификатора объекта с (хэшированными) идентификаторами объектов ключей, которые уже хранятся в хеше.(намного быстрее)
Недостаток: Каждый символ занимает ячейку в таблице символов интерпретатора Ruby, которая никогда не освобождается.Символы никогда не собираются мусором.Так что угловой случай - это когда у вас есть большое количество символов (например, автоматически сгенерированных).В этом случае вы должны оценить, как это влияет на размер вашего интерпретатора Ruby.
Примечания:
Если вы выполняете сравнение строк, Ruby может сравнивать символы только по их объекту.идентификаторы, без необходимости оценивать их.Это намного быстрее, чем сравнение строк, которые необходимо оценить.
Если вы обращаетесь к хешу, Ruby всегда применяет хеш-функцию для вычисления «хеш-ключа» из любого ключа, который вы используете.Вы можете представить что-то вроде MD5-хеша.И затем Руби сравнивает эти «хешированные ключи» друг с другом.
Длинный ответ:
http://www.reactive.io/tips/2009/01/11/the-difference-between-ruby-symbols-and-strings
http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol