Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
Топ:
Проблема типологии научных революций: Глобальные научные революции и типы научной рациональности...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Интересное:
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Дисциплины:
2022-09-29 | 33 |
5.00
из
|
Заказать работу |
|
|
Строки, которые вы использовали в этой главе, являются гибкими, но
эта гибкость требует немалой производительности. Предположим, вам нужно просеять огромный файл с миллионами минеральных объектов
и дать каждому соответствующее название, по сути — назначить идентификатор. Здесь вам лучше бы использовать символы, ведь
каждый из назначенных символов тоже является объектом:
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!