Які приклади використання символьних літералів у Scala?


93

Використання буквених символів не відразу зрозуміло з того, що я читав на Scala. Хтось би потурбувався поділитися якимись реальними потребами світу?

Чи є певна ідіома Java охоплена символьними буквами? Які мови мають подібні конструкції? Я приходжу з фона Python і не впевнений, що в цій мові є щось аналогічне.

Що мотивує мене використовувати "HelloWorld vs" HelloWorld "?

Дякую

Відповіді:


76

З точки зору Java, символи - це інтерновані рядки. Це означає, наприклад, що порівняння порівняльної рівності ( eqу Scala та ==Java) дає такий самий результат, як і порівняння звичайних рівностей ( ==у Scala та equalsJava): 'abcd eq 'abcdповернеться true, тоді як"abcd" eq "abcd" не може, залежно від примх JVM (ну, це повинно для літералів, але не для рядків, створених динамічно в цілому).

Інші мови, які використовують символи, - це Lisp (який використовує, 'abcdяк Scala), Ruby ( :abcd), Erlang і Prolog ( abcd; вони називаються атомами замість символів).

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


25
Напевно, варто пам’ятати, що == у Scala робить річ .equals, тому насправді різниця була б у використанні методу «eq», який робить рівнею еталонності. Однак одним із бонусів є те, що порівняння між символами надзвичайно дешеве.
Калам

@Calum, як і порівняння між двома рядками. Java-інтерни (більш-менш) всі рядки.
Елазар Лейбович

4
@Elazar: Це дійсно так? У мене склалося враження, що Java лише інтерновані літерали (тобто майже всі рядки в тривіальних прикладах, і майже немає рядків у виробничому програмному забезпеченні). Сказавши, що випадки використання символів зазвичай бувають буквальними значеннями (я сумніваюся, ви часто будуєте їх з нуля), тому, мабуть, головна перевага, яке ви отримуєте, - це лише більш описовий тип.
Calum

1
@Elazar Вони не є, тому що символи можуть покладатися на їх інтернування, тоді як для Strings це необов'язково і може оптимізувати деякі випадки використання. Символи більше схожі на динамічно створені Енуми, ніж будь-що. Я детально зупинився на цьому на відповіді, яку я пов'язав у своїй останній відповіді; будь ласка, прочитайте його для отримання додаткової інформації.
Калам

3
Отже, "привіт, світ!" - це послідовна колекція персонажів, тоді як "helloWorld - це доброзичливі для людей цінності, а не 14392.
CW Holeman II

26

Якщо у вас є прості рядки, що представляють імена методів, які говорять у коді, які, можливо, будуть передані навколо, ви не зовсім передаєте речі належним чином. Це своєрідне питання межі даних / коду, не завжди легко провести лінію, але якби ми сказали, що в цьому прикладі ці назви методів є більш кодовими, ніж вони є даними, тоді ми хочемо щось чітко визначити це .

Символьний літерал вступає в гру, де він чітко розмежовує всі старі рядкові дані з конструкцією, яка використовується в коді. Це просто дійсно там, де ви хочете вказати, це не просто деякі рядкові дані, а насправді в деякому роді частина коду. Ідея, що стосується вашої IDE, підкреслила б її по-різному, і, враховуючи інструментарій, ви могли б переробити їх, а не робити пошук / заміну тексту.

Це посилання обговорює це досить добре.


1
Це корисне пояснення. Мене змушує задуматися над альтернативами перерахункам - які можуть бути незграбними
javadba

2

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

Також Java та Scala автоматично використовують "інтерновані рядки" для швидшого пошуку. За допомогою scala ви можете використовувати internметод для примусового стажування рядка, але цей процес працює не з усіма рядками. Символи виграють від гарантії інтернації, тому для перевірки рівності чи нерівності достатньо однієї контрольної перевірки рівності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.