В этой главе представлено несколько новых концепций, которые помогут вам приступить к написанию реальных приложений Crystal. Вы узнали об основных типах значений (числа, текст, диапазоны и логические значения), о том, как определять переменные для хранения данных и управления ими, а также о том, как управлять потоком выполнения с помощью условных операторов и циклов. Вы рассмотрели создание методов повторного использования кода различными способами. Наконец, вы узнали о сборе данных с помощью Array
и Hash
, а также об использовании блоков и параметров splat
. Это набор инструментов, который вы будете использовать до конца книги.
В последующих главах мы начнем применять эти знания в практических проектах. Далее давайте воспользуемся возможностями объектной ориентации Crystal для создания масштабируемого программного обеспечения.
Дальнейшее чтение
Некоторые языковые детали были опущены, чтобы сделать текст кратким и целенаправленным. Однако вы можете найти документацию и справочные материалы по всему, что здесь объясняется более подробно, на веб-сайте Crystal по адресу https://crystal-lang.org/docs/.
3. Объектно-ориентированное программирование
Как и многие другие, Crystal — объектно-ориентированный язык. Таким образом, в нем есть объекты, классы, наследование, полиморфизм и так далее. Эта глава познакомит вас с возможностями Crystal по созданию классов и работе с объектами, а также познакомит вас с этими концепциями. Crystal во многом вдохновлен Ruby, который сам по себе многое заимствует из языка Small Talk, известного своей мощной объектной моделью.
В этой главе мы рассмотрим следующие основные темы:
• Понятие объектов и классов
• Создание собственных классов.
• Работа с модулями
• Значения и ссылки — использование структур.
• Общие классы
• Исключения
Технические требования
Для выполнения задач этой главы вам понадобится следующее:
• Рабочая установка Кристалла.
• Текстовый редактор, настроенный для использования Crystal.
Инструкции по настройке Crystal см. в
Вы можете найти весь исходный код этой главы в репозитории этой книги на GitHub по адресу https://github.com/PacktPublishing/Crystal-Programming/tree/main/Chapter03.
Понятие объектов и классов
Объекты содержат внутри себя некоторый объем данных и управляют доступом и поведением вокруг этих данных. Они подобны актерам, взаимодействующим с другими объектами посредством вызова методов и обмена данными в строго определенном интерфейсе. Ни одному объекту не разрешается напрямую вмешиваться во внутреннее состояние другого объекта — все взаимодействие определяют методы.
Классы — это чертежи, на основе которых создаются объекты. Каждый объект является экземпляром некоторого класса. Класс определяет структуру данных, доступные методы, поведение и внутреннюю реализацию. Класс объекта часто называют его типом: каждый объект имеет тип.
nil
является объектом класса Nil
и имеет методы. Вы можете запросить класс объекта, вызвав для него метод .class
:
p 12.class # => Int32
p "hello".class # => String
p nil.class # => Nil
p true.class # => Bool
p [1, 2, "hey"].class # => Array(Int32 | String)
В предыдущем примере вы можете видеть, что существуют более сложные классы, такие как
Каждый класс предоставляет некоторые методы объектам, которые являются его экземплярами. Например, все экземпляры класса String
имеют метод size
, который возвращает количество символов строки в виде объекта типа Int32
. Аналогично, объекты типа Int32
имеют метод с именем +
, который принимает другое число в качестве единственного аргумента и возвращает его сумму, как показано в следующем примере:
p "Crystal".size + 4 # => 11
Это то же самое, что и более явная форма:
p("Crystal".size().+(4)) # => 11
Это показывает, что все распространенные операторы и свойства — это просто вызовы методов.
Некоторые классы не имеют буквального представления, и объекты необходимо создавать непосредственно с использованием имени класса. Ниже приведен пример: