Другое

Использование методов и классов в языке программирования Crystal.(07)

Lorem ipsum dolor

Использование методов

Переменные и базовая логика образуют основу языка программирования, но большинство "кодерских" решений требуют большего разнообразия конструкций. Crystal, как и Ruby, предлагает методы в качестве первоначальной единицы, образующей программную архитектуру.

Методы имеют имена, принимают аргументы (в языке Crystal — типизированные аргументы!) и возвращают значения. Независимые методы также называются функциями, но поскольку Crystal обычно использует их в контексте объектов и классов, вы вы чаще будете иметь дело именно с методами.

Вы уже использовали несколько методов — typeof, puts, p, которые являются методами верхнего уровня, доступными откуда угодно. Некоторые методы предназначены для специфического контекста.

Метод size допустимо применять к строкам, тогда как "each" предназначен для массивов.

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

===

foundat...

...

\фрагмент кода отсутствует...\

===

Аргументы перечисляются в скобках сразу после имени метода. Этот метод принимает только

один аргумент; при наличии нескольких аргументов они будут разделены запятыми.

Аргументы воспринимаются как переменные, существующие в области действия метода.

Обратите внимание, что метод возвращает значение своего последнего выражения. Программный код может ясно сформулировать "returns num * 2", но это не обязательно так.

 

Метод double выглядит так, как будто он предназначен для работы с числами и с оператором умножения,

но на самом деле его применение является более разносторонним. Строки в языке Crystal также позволяют использовать оператор умножения; double("6") возвращает результат 66. Но double(true) выводит сообщение < in line 2: undefined method ’*’ for Bool >.

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

===

fo...

...

===

Теперь, если попытаться выполнить "double(6)", Crystal скажет "нет", возвращая ошибку (без перегружаемых совпадений ‘double’ с типом String"). Кстати, "перегрузка" указывает на другую интересную возможность.

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

===

f...

...

===

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

 

Ваш черёд 5 (Практическое задание 5)

Запишите метод sample, который возвращает массив, содержащий случайные числа с плавающей десятичной запятой. Размер массива передается в качестве аргумента в выборку. (Подсказка: Используйте rand для создания случайного числа, соответствующего виду float.)



Организация кода в классах и модулях

Переменные и методы являются мощным средством, но они должны быть организованы в более крупные структуры, чтобы быть действительно полезными. Поскольку Crystal является полноценным объектно-ориентированным языком, классы представляются основным инструментом для реализации сложных конструкций. Классы позволяют описать комбинации методов и связанных с ними данных, которые затем можно превратить в объекты с помощью команды "new". Когда вы создаете классы, которые будут работать друг с другом, вы можете скомпоновать их в более крупные модули. Базовые классы Кристалла очень похожи на классы Ruby, хотя Crystal и внёс некоторые изменения.

 

Основы понятия Класс

Классы группируют общедоступные методы и свойства, а также могут включать в себя дополнительные методы и переменные, чтобы всё вместе работало как задумано. Имена классов начинаются с заглавной буквы, но остальная часть имени обычно пишется строчными или же в «ГорбатомРегистре» (верхний регистр служит для разделения слитной последовательности слов), для контраста с названиями методов и переменных.

Когда вы строите новый класс, вы также создаете новый тип. Этот чрезвычайно простой пример

демонстрирует оформление пустого класса, создание из него объекта и проверку типа объекта.

===

f...

...

===

Это еще не полновесный объект, но дополнить его совсем не сложно. При создании минерала следует указать его наименование и твердость, что-то вроде mine = Mineral.new("talc", 1.0).

Твердость не обязательно является целым числом, и потому этот объект ориентирован на дробные числа (типа Float64).

В языке Crystal, как и в Ruby, это делается с помощью метода initialize (он исполняет роль конструктора), принимающего аргументы указанного типа.

===

f...

...

===

Поскольку аргументы "common_name" и "hardness" пока никак не используются (помимо простого назначения), компилятору не хватает информации, необходимой для определения их типа; и он пожалуется на то, что вы не указали их.

И @common_name, и @hardness являются переменными экземпляра, специфичными для объекта

созданного здесь. Crystal также может сохранить несколько ваших типизаций в методе initialize.

Если вы используете имена переменных экземпляра (добавляя префикс @) в качестве имен аргументов, то Crystal просто помещает эти аргументы в переменные экземпляра.

===

f...

...

===

Но теперь уже нет возможности получить доступ к этим переменным экземпляра извне объекта.

Если вы запросите, например, Mineral.common_name, то получите сообщение "неопределенный метод ’common_name’ для Mineral.class". Можно создать метод с именем common_name=, возвращающий значение @common _ name, но Crystal предлагает кое-что более простое: "извлекатели" и "установщики" (getters и setters).

Вы можете разрешить чтение и манипулирование методом "common_name" извне объекта, а также считывание твердости (hardness), написав:

===

f...

...

===

Компилятор может опознать объявления типов, прописанные выше или ниже в тексте (где вам удобнее), но размещение в верхней части класса считается более понятным для людей, поэтому в предыдущем примере с getter сделано именно так. Доработанная реализация класса позволяет вам читать и изменять название минерала, и также считывать твердость. Если вы попытаетесь установить твердость (hardness), то всё равно получите ошибку "undefined method name" из-за отсутствия установщика setter. (Если вы Рубист, то могли заметить, что getter эквивалентен attr_reader в языке программирования Ruby, установщик setter эквивалентен "attr_writer", а "property" соответствует "attr_accessor". Только они более кратки и выразительны, достаточно просто взглянуть на аналогичные классы Ruby.)

В отличие от переменных, методы в классах Crystal по умолчанию видны вне объекта. Они похожи на методы, которые вы задавали ранее, но только на них необходимо ссылаться через объект или из их собственного содержимого. Простой объектный метод будет выглядеть следующим образом:

===

f...

...

===

Чтобы расширить возможности describe, в примере добавлена переменная crystal_struct.

Метод описания (describe) собирает три переменные объекта и вставляет их между словосочетаниями, образуя предложение. Это также демонстрирует, что строки в языке Crystal могут содержать "разрывы", которые могут быть полезными или раздражающими (в зависимости от контекста и ваших предпочтений.)

В части II, главе 5 (Использование классов и структур), мы глубже исследуем классы и обсудим видимость, наследование, а также иерархию классов и то, как используются методы в классах Crystal.

 

Ваш черёд 6 (Практическое задание 6).

  1. Предположим, вы хотите иметь возможность сделать объекты класса Mineral для минералов, кристаллическая структура (crystal_struct) которых вам пока не известна. Как можно это сделать? Подсказка: Используйте тип объединения для описания свойств минералов (property).
  2. Добавьте метод "to_s", который создает строковое (String) представление объекта Mineral, и используйте его для вывода предложения. (Подсказка: Подходящий объект — self.)

 

Схожие статьи

Vue JS анимация. Примеры, синтаксис и основные разновидности анимации
Другое

Vue JS анимация. Примеры, синтаксис и основные разновидности анимации

Распознавание объектов на фото: принцип работы и способ реализации
Другое

Распознавание объектов на фото: принцип работы и способ реализации

Первый программист в мире: кто он, с чего начал путь и какую программу создал
Другое

Первый программист в мире: кто он, с чего начал путь и какую программу создал

Сколько зарабатывают программисты Java и какая средняя зарплата?
Другое

Сколько зарабатывают программисты Java и какая средняя зарплата?

×