Использование символов в качестве идентификаторов — КиберПедия 

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Использование символов в качестве идентификаторов

2022-09-29 33
Использование символов в качестве идентификаторов 0.00 из 5.00 0 оценок
Заказать работу

Строки, которые вы использовали в этой главе, являются гибкими, но
эта гибкость требует немалой производительности. Предположим, вам нужно просеять огромный файл с миллионами минеральных объектов
и дать каждому соответствующее название, по сути — назначить идентификатор. Здесь вам лучше бы использовать символы, ведь
каждый из назначенных символов тоже является объектом:

types_and_control_flow/symbols.cr

class Mineral

property name

  

def initialize(@name: Symbol)

  end

  end

mineral1 = Mineral.new(:talc)

mineral8547 = Mineral.new(:talc)

 

p mineral1.name

# =>:talc

p mineral8547.name # =>:talc

p:talc # =>:talc

  mineral8547.name =:gold

 :gold.class # => Symbol

 

Поскольку символ хранится как уникальное значение Int32, его использование вместо строк экономит память. Символы также являются отличным выбором для хэш-ключей, вместо использования строкового типа (Strings). Вот как мы можем воспользоваться ими в нашем валютообменном проекте:

types_and_control_flow/curr_conv3.cr

CURRENCIES = {

:EUR => "Euro",

:CAD => "Canadian Dollar",

:CNY => "Chinese Yuan",

:INR => "Indian Rupee",

:MXN => "Mexican Peso",

}

Чтобы передать больше смысла, имя символа также может заканчи-ваться на "?" или "!". Все операторы также имеют свой собственный символ, например: * и "&".

 

Ваш черёд № 3

Есть ли разница между символом и строкой, несущей такое же
(точную копию) значение? Обоснуйте ответ.

 

 

Использование перечислений

Иногда вам хочется ограничить функциональность кода не только символами, но и меньшим набором возможностей. Это может оказаться весьма удобным — группировать переменные в разрозненный ряд значений, таких как цвета светофора или указания компаса, в специфический тип. Crystal поддерживает перечисления (Enums) для группирования связанных значений, в особенности — когда число отдельных значений не слишком велико:

types_and_control_flow/enums.cr

enum Direction

 

North # value 0

East # value 1

South # value 2

West # value 3

  end

 

Direction::South # South

Direction::South.value # => 2

 

Перечисления хранятся внутри в виде целых чисел, но отображение
их имён в коде делает его более понятным для людей. В струк-турированной Вселенной Кристалла все перечисления наследуются от базового класса Enum, и вы можете даже задавать методы для них.
У перечислений есть ещё одно важное преимущество: их проверяет компилятор. Но если вы неправильно написали символ, он будет
сохранен как новый символ.

Direction::Eest # Error: undefined constant Direction::Eest

:gold

:goold

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

 

 

Использование регулярных выражений

Иногда требуется гибкость строк, но вам нужно еще и эффективно их обрабатывать. Поиск и замена внутри строк также может затратить
много циклических операций. Регулярные выражения ("регексы" — от англ. regex) могут значительно снизить затраты на обработку строк, благодаря высоко-оптимизированным моделям обработки данных.

Crystal использует синтаксис PCRE. Это реализовано как привязка к
C-библиотеке PCRE. (Хотя Ruby использует другой механизм regex,
он также использует синтаксис PCRE.) Шаблоны обычно создаются с помощью синтаксического литерала /pattern/.

Если у вас есть регекс, содержащий косую черту (слэш), которую вам нежелательно удалять, вы можете создать шаблон с помощью "%r(pattern)". Лишь после создания шаблона его можно применять к строкам. Используйте сочетание "=~" или метод match, чтобы про-
верить совпадают ли две строки и с какой начальной позиции.

types_and_control_flow/regex.cr

str = "carbonantimonygolddiamond"

pattern = /gold/

    p str =~ pattern # => 14

В этом случае gold появляется в начальной позиции 14. Если же "gold" отсутствует в строке, проверка соответствия (match) вернет ноль (nil). Поскольку ноль несет значение "не истина", можно легко проверить совпадения с помощью конструкции "if materials =~ pattern", запускающей выполнение некоторых задач, если есть совпадение, либо каких-то иных задач — если совпадение отсутствует.

Вы можете также извлечь дополнительные сведения о строке и о её
связи с вашим регулярным выражением:

types_and_control_flow/regex.cr

materials = "carbonantimonygolddiamond"

pat = /(.+)gold(.+)/ # searches for gold

str = "carbonantimonygolddiamond"

str =~ pat # => 0

$1 # => "carbonantimony"

$2 # => "diamond"

 

str.match pat # =>

# <Regex::MatchData "carbonantimonygolddiamond"

                 # 1:"carbonantimony" 2:"diamond">

 

В этом примере начальное положение оглашено как "ноль" (и также истинно, что будет удобным для использования if), поскольку мы учитываем префикс (.+). Методы из класса Regex позволяют вам глуб-
же заглянуть в результаты сопоставления.

Crystal позволяет использовать синтаксис интерполяции строк (#{}) в литералах регулярных выражений, давая вам потенциально мощные возможности на стадии выполнения кода. Конечно, это также позволяет вам случайно создавать исключения времени выполнения, если ва-
шей вставкой интерполируется грязный синтаксис, так что будьте осторожны!

 

 


Поделиться с друзьями:

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.