Каковы некоторые примеры использования символьных литералов в Scala? - PullRequest
87 голосов
/ 23 апреля 2009

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

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

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

Спасибо

Ответы [ 3 ]

73 голосов
/ 23 апреля 2009

В терминах 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 может разумно использовать символы для имен таблиц и столбцов.

25 голосов
/ 23 апреля 2009

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

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

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

1 голос
/ 23 ноября 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...