Каковы некоторые примеры использования символьных литералов в Scala?

Использование символьных литералов не сразу видно из того, что я прочитал в Scala. Кто-нибудь захочет поделиться некоторыми видами использования в реальном мире?

Существует ли какая-либо конкретная Java-идиома, покрываемая символьными литералами? Какие языки имеют похожие конструкции? Я исхожу из фона Python и не уверен, что на этом языке есть что-то подобное.

Что бы побудило меня использовать "HelloWorld vs" HelloWorld??

Спасибо

Ответ 1

В терминах Java символы являются интернированными строками. Это означает, например, что сравнение эталонного равенства (eq в Scala и == в Java) дает тот же результат, что и сравнение нормального равенства (== в Scala и equals в Java): 'abcd eq 'abcd вернет true, а "abcd" eq "abcd" не может, в зависимости от прихотей JVM (ну, это должно для литералов, но не для строк, созданных динамически вообще).

Другими языками, которые используют символы, являются Lisp (который использует 'abcd как Scala), Ruby (:abcd), Erlang и Prolog (abcd; они называются атомами вместо символов).

Я бы использовал символ, когда меня не волнует структура строки и использую ее как имя для чего-то. Например, если у меня есть таблица базы данных, представляющая компакт-диски, в которую входит столбец с именем "цена", мне все равно, что второй символ в "цене" равен "r" или о конкатенации имен столбцов; поэтому библиотека базы данных в Scala может разумно использовать символы для имен таблиц и столбцов.

Ответ 2

Если у вас есть простые строки, представляющие имена методов в коде, которые, возможно, пройдены, вы не совсем правильно передаете вещи. Это своего рода проблема с границей данных/кода, не всегда легко провести линию, но если бы мы сказали, что в этом примере эти имена методов больше кода, чем они являются данными, тогда мы хотим, чтобы что-то четко определяло, что.

Символ Literal входит в игру, где он четко отличает только любые старые строковые данные с использованием конструкции, используемой в коде. Это просто там, где вы хотите указать, это не только некоторые строковые данные, но и фактически часть кода. Идея, подобная вашей среде IDE, будет выделять ее по-разному, и с учетом инструментария вы можете реорганизовать их, вместо того, чтобы выполнять поиск и замену текста.

Эта ссылка обсуждает ее довольно хорошо.

Ответ 3

Python создает внутреннюю глобальную таблицу "интернированных строк" ​​с именами всех переменных, функций, модулей и т.д. В этой таблице интерпретатор может выполнять более быстрые поиски и оптимизации. Вы можете заставить этот процесс с помощью функции intern (sys.intern в python3).

Кроме того, Java и Scala автоматически используют "интернированные строки" для более быстрого поиска. С помощью scala вы можете использовать метод intern, чтобы заставить стажер строки, но этот процесс не работает со всеми строками. Символы выигрывают от гарантированного интернирования, поэтому для проверки равенства или неравенства достаточно одной контрольной проверки равенства.