Каковы некоторые примеры использования символьных литералов в 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
, чтобы заставить стажер строки, но этот процесс не работает со всеми строками. Символы выигрывают от гарантированного интернирования, поэтому для проверки равенства или неравенства достаточно одной контрольной проверки равенства.