Все о Perl 6: Классы и Объекты
Следующая программа показывает как может выглядеть обработчик зависимостей в Perl 6. Она демонстрирует использование пользовательских конструкторов, приватных и публичных атрибутов, методов, а также некоторые аспекты сигнатур. Кода в примере приведено не много, тем не менее он интересен и местами полезен.
class Task {
has &!callback;
has Task @!dependencies;
has Bool $.done;
method new(&callback, Task *@dependencies) {
return self.bless(*, :&callback, :@dependencies);
}
method add-dependency(Task $dependency) {
push @!dependencies, $dependency;
}
method perform() {
unless $!done {
.perform() for @!dependencies;
&!callback();
$!done = True;
}
}
}
my $eat =
Task.new({ say 'eating dinner. NOM!' },
Task.new({ say 'making dinner' },
Task.new({ say 'buying food' },
Task.new({ say 'making some money' }),
Task.new({ say 'going to the store' })
),
Task.new({ say 'cleaning kitchen' })
)
);
$eat.perform();
Приступая к изучению классов
Perl 6, как и много других языков, использует ключевое слово class
для определения нового класса. Следующий затем блок, как и любой другой блок, может содержать произвольный код, однако классы обычно содержат определения состояний и поведения.
Код примера содержит атрибуты (состояния), определяемые с помощью ключевого слова has
, и поведения, определяемые с помощью method
.
Определение класса создает объект-тип, который по умолчанию становиться
доступным внутри текущего пакета ( аналогично переменным, определенным с
помощью our
). Этот объект-тип является "пустым экземпляром" класса.
С ними мы встречались в предыдущих главах. Например, каждый из типов Int
и Str
относятся к объектам-типам одного из встроенных в Perl 6 классов.
Код примера в начале главы демонстрирует, как имя класса Task
может
использоваться в роли ссылки в дальнейшем, например для создания экземпляров класса вызывая метод new
.
Объекты-типы не определены в том смысле, что они возвращают значение False
если вызвать их метод .defined
. Эту особенность можно использовать чтобы узнать является ли какой-либо объект объектом-типом или нет:
my $obj = Int;
if $obj.defined {
say "Ordinary, defined object";
} else {
say "Type object";
}
Эта статья входит в книгу "Все о Perl 6".