Ruby - В чем разница между intern и to_sym

Я наткнулся на Ruby String Documentation и протестировал методы. Два метода, которые я нашел похожими, - это методы to_sym и intern.

"cat".intern
=> :cat

"cat".to_sym
=> :cat

Я искал Qaru и, на удивление, этого не задавали. Я сам не могу найти разницы между этими двумя, поэтому я подумал, что попрошу об этом.

Если они делают то же самое, один метод быстрее другого? Если это так, имеет смысл использовать этот метод.

Ответы

Ответ 1

Они, похоже, являются псевдонимами для одного и того же. Из документации вы можете видеть, что в примере кода intern используется to_sym:

intern → symbol

Возвращает символ, соответствующий str, создавая символ, если он ранее не существовало. См. Symbol#id2name.

"Koala".intern         #=> :Koala
s = 'cat'.to_sym       #=> :cat
s == :cat              #=> true
s = '@cat'.to_sym      #=> :@cat
s == :@cat             #=> true

Это также можно использовать для создания символов, которые не могут быть представлены используя нотацию: xxx.

'cat and dog'.to_sym   #=> :"cat and dog"

Ответ 2

Rubocop использует это сравнение в качестве примера для одного из своих копов: Style/StringMethods по умолчанию для этого полицейского to_sym предпочтительнее, чем intern, без какой-либо ссылки на руководство по стилю. или дальнейшая документация. Мое личное наблюдение состоит в том, что выбор сделан только из-за читабельности; учитывая, что производительность не является проблемой, как указано в других ответах.