litbaza книги онлайнРазная литератураCrystal Programming. Введение на основе проекта в создание эффективных, безопасных и читаемых веб-приложений и приложений CLI - Джордж Дитрих

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 12 13 14 15 16 17 18 19 20 ... 75
Перейти на страницу:
организовывать в нескольких файлах. Всегда существует основной файл, который вы передаете команде crystal run или crystal build, но этот файл может ссылаться на код в других файлах с ключевым словом require. Компиляция всегда начинается с анализа этого основного файла, а затем рекурсивного анализа любого файла, на который он ссылается, и так далее.

Разберем пример:

1. Сначала создайте файл с именем Factorial.cr:

def factorial(n)

    (1..n).product

end

2. Затем создайте файл с именем program.cr:

require "./factorial"

(1..10).each do |i|

    puts "#{i}! = #{factorial(i)}"

end

В этом примере require «./factorial» будет искать файл с именем factorial.cr в той же папке, что и program.cr, и импортируйте все, что он определяет. Невозможно выбрать только часть того, что определяют необходимые файлы; требуют импорта всего последовательно. Запустите этот пример с помощью crystal run program.cr.

Один и тот же файл не может быть импортирован дважды; компилятор Crystal проверит и проигнорирует такие попытки.

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

require "./filename"

Начальный параметр ./ сообщает Crystal искать этот файл в текущем каталоге относительно текущего файла. Он будет искать файл с именем filename.cr или каталог с именем filename, в котором находится файл с именем filename.cr. Вы также можете использовать ../ для ссылки на родительский каталог.

Также поддерживаются шаблоны Glob для импорта всех файлов из заданного каталога, как здесь:

require "./commands/*"

Это импортирует все файлы Crystal в каталог команд. Импорт всего из текущего каталога также допустим:

require

Эта нотация используется в первую очередь для ссылки на файлы из вашего собственного проекта. При ссылке на файлы из установленной библиотеки или стандартной библиотеки Crystal путь не начинается с расширения ..

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)

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

Каждый класс предоставляет некоторые методы объектам, которые являются

1 ... 12 13 14 15 16 17 18 19 20 ... 75
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?