В терминах Java символы - это интернированные строки. Это означает, например, что сравнение эталонного равенства ( eq
в Scala и ==
в Java) дает тот же результат, что и обычное сравнение равенства ( ==
в Scala и equals
в Java): 'abcd eq 'abcd
вернет истину, а "abcd" eq "abcd"
может и нет, в зависимости от прихоти JVM (ну, должно для литералов, но не для динамически создаваемых строк вообще).
Другие языки, которые используют символы, - это Lisp (который использует 'abcd
как Scala), Ruby ( :abcd
), Erlang и Prolog ( abcd
; они называются атомами вместо символов).
Я бы использовал символ, когда меня не волнует структура строки и я использую его исключительно как имя для чего-то. Например, если у меня есть таблица базы данных, представляющая компакт-диски, которая включает столбец с именем «цена», меня не волнует, что второй символ в «цене» - это «r», или о соединении имен столбцов; поэтому библиотека баз данных в Scala могла разумно использовать символы для имен таблиц и столбцов.
Если у вас есть простые строки, представляющие, скажем, имена методов в коде, которые, возможно, передаются, вы не совсем правильно передаете вещи. Это своего рода проблема границы данных / кода, не всегда легко провести черту, но если бы мы сказали, что в этом примере эти имена методов представляют собой больше кода, чем данных, тогда мы хотим, чтобы что-то четко идентифицировало это .
В игру вступает символьный литерал, который четко различает любые старые строковые данные с конструкцией, используемой в коде. Это действительно именно то место, где вы хотите указать, это не просто некоторые строковые данные, а фактически часть кода. Идея, заключающаяся в том, что такие вещи, как ваша IDE, подчеркнет это по-другому, и, учитывая инструменты, вы можете реорганизовать их, а не выполнять поиск / замену текста.
Эта ссылка обсуждает это довольно хорошо.
источник
Python поддерживает внутреннюю глобальную таблицу «интернированных строк» с именами всех переменных, функций, модулей и т. Д. С помощью этой таблицы интерпретатор может ускорить поиск и оптимизацию. Вы можете форсировать этот процесс с помощью
intern
функции (sys.intern
запустить в python3).Кроме того, Java и Scala автоматически используют «интернированные строки» для более быстрого поиска. С помощью scala вы можете использовать этот
intern
метод для принудительного вставки строки в строку, но этот процесс работает не со всеми строками. Символы выигрывают от гарантированного интернирования, поэтому проверки равенства одной ссылки достаточно для доказательства равенства или неравенства.источник
Заметка:
Symbols
будет объявлено устаревшим, а затем будет удалено в Scala 3 (точка).Ссылка: http://dotty.epfl.ch/docs/reference/dropped-features/symlits.html
Из-за этого я лично рекомендую
Symbols
больше не использовать (по крайней мере, в новом коде Scala). Как говорится в точечной документации:источник