Выбрать главу

require "filename"

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

require "http/server" # Imports the HTTP server from stdlib.

Server = HTTP::Server.new do |context|

    context.response.content_type = "text/plain"

    context.response.print "Hello world, got

    #{context.request.path}!"

end

puts "Listening on http://127.0.0.1:8080" server.listen(8080)

Для чего-либо большего, чем пара сотен строк, предпочтительнее разделить код и организовать его в файлах, каждый из которых имеет определенную цель или область применения. Таким образом, легче найти ту или иную часть приложения.

Резюме

В этой главе представлено несколько новых концепций, которые помогут вам приступить к написанию реальных приложений Crystal. Вы узнали об основных типах значений (числа, текст, диапазоны и логические значения), о том, как определять переменные для хранения данных и управления ими, а также о том, как управлять потоком выполнения с помощью условных операторов и циклов. Вы рассмотрели создание методов повторного использования кода различными способами. Наконец, вы узнали о сборе данных с помощью Array и Hash, а также об использовании блоков и параметров splat. Это набор инструментов, который вы будете использовать до конца книги.

В последующих главах мы начнем применять эти знания в практических проектах. Далее давайте воспользуемся возможностями объектной ориентации Crystal для создания масштабируемого программного обеспечения.

Дальнейшее чтение

Некоторые языковые детали были опущены, чтобы сделать текст кратким и целенаправленным. Однако вы можете найти документацию и справочные материалы по всему, что здесь объясняется более подробно, на веб-сайте Crystal по адресу https://crystal-lang.org/docs/.

3. Объектно-ориентированное программирование

Как и многие другие, Crystal — объектно-ориентированный язык. Таким образом, в нем есть объекты, классы, наследование, полиморфизм и так далее. Эта глава познакомит вас с возможностями Crystal по созданию классов и работе с объектами, а также познакомит вас с этими концепциями. Crystal во многом вдохновлен Ruby, который сам по себе многое заимствует из языка Small Talk, известного своей мощной объектной моделью.

В этой главе мы рассмотрим следующие основные темы:

• Понятие объектов и классов

• Создание собственных классов.

• Работа с модулями

• Значения и ссылки — использование структур.

• Общие классы

• Исключения

Технические требования

Для выполнения задач этой главы вам понадобится следующее:

• Рабочая установка Кристалла.

• Текстовый редактор, настроенный для использования Crystal.

Инструкции по настройке Crystal см. в Главе 1 «Введение в Crystal» и в Приложении A «Настройка инструментов» для инструкций по настройке текстового редактора для Crystal.

Вы можете найти весь исходный код этой главы в репозитории этой книги на GitHub по адресу https://github.com/PacktPublishing/Crystal-Programming/tree/main/Chapter03.

Понятие объектов и классов

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

Классы — это чертежи, на основе которых создаются объекты. Каждый объект является экземпляром некоторого класса. Класс определяет структуру данных, доступные методы, поведение и внутреннюю реализацию. Класс объекта часто называют его типом: каждый объект имеет тип.

В Crystal все является объектом: каждое значение, с которым вы взаимодействуете, имеет тип (то есть класс) и методы, которые вы можете вызывать. Числа — это объекты, строки — это объекты — даже 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)

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