Всем привет, ликбез по шестому перлу еще не закончен. Можно сказать, он только набирает обороты, впереди еще много интереснейших тем.
В предыдущих сериях мы познакомились с переменными, блоками и выражениями, циклами и подпрограммами. Исходя уже из этих постов, можно делать всяческие выводы, нужен ли Perl 6, кому он нужен и зачем. Но делать выводы — занятие зело неблагодарное, поэтому давайте продолжать знакомство, не оглядываясь на умных дядек.
Тем более, что повод есть: «ООП в Perl 6»
Еще небольшое вступление: в этой статье я описал только то, что можно назвать базовым знанием ООП в шестом перле. На самом деле, все куда интереснее и сложнее, но если все это помещать в отдельную статью, то не хватит ни мения, чтобы это написать, ни кого-то другого, чтобы прочитать.
Все есть объект
Вы можете использовать любую часть кода, как объект, если захотите. Например, массивы имеют метод .elems, возвращающий количество элементов.
my @scores = <52 95 78>;
say @scores.elems; # 3
Доступны также .push, .pop, .shift и тп.
@scores.push(88);
say @scores.shift; # 52
Классы
Основное объявление класса в Perl 6 не отличается от оного во многих других языках. Сначала идут атрибуты класса, затем — методы.
class Dog {
has $.name;
has @!paws;
method bark() {
say "w00f";
}
}
Все атрибуты имеют вид $!foo (или @!foo, %!foo и тд). Объявление атрибута в виде $.foo создает акцессор. Если добавить к нему «is rw», то создается мутатор.
has $!brain; # Закрытый
has $.color; # Акцессор
has $.name is rw; # Акцессор и мутатор
Классы могут находиться как в отдельном файле, подобно модулям в Perl 5. Тогда, чтобы использовать его, нужно написать в начале:
use MuaClass;
Сам же класс, находящийся внутри файла, объявить можно так:
class MuaClass;
...
В Perl 6 классы можно размещать и внутри одного файла, причем классов может быть сколь угодно много, каждый из них помещается внуть отдельного лексического блока. Соответственно, use уже писать не надо.
class Dog { ... }
class Cat { ... }
Наследование
Просто используйте ключевое слово is.
class Puppy is Dog {
method bark() {
say "yap";
}
method chew($item) {
$item.damage;
}
}
Множественное наследование также доступно:
class Puppy is Dog is Pet { ... }
Ключевое слово handles указывает на принадлежность атрибутов конкретным методам:
has $!brain handles 'think';
has $!mouth handles ;
Можно использовать парную контструкцию, чтобы переименовать атрибут внутри самого метода:
has $!brain handles :think('use_brain')
Ключевое слово self
Для доступа к методам и атрибутам класса внутри самого класса, обычно придумывают инвоканты. Во всех учебниках упорно пишут, что получить инвокант внутри метода можно, поставив в конец имени переменной :
method hello ($self: $a, $b) { ... }
… однако, у меня этот фокус не проходит. Зато есть ключевое слово self, которое не описано почти негде. И оно работет.
Прото-объекты
- Когда вы декларируете класс, он создает в памяти объект-прототип.
- Это похоже на пустой инстанс объекта
- Вы можете вызвать метод new для создания нового инстанса вот так:
my $fido = Dog.new();
Создание объекта класса
При создании объекта класса можно определить значения атрибутов:
my $pet = Puppy.new(
name => 'Rosey',
color => 'White'
);
Методы
Они создаются с помощью ключевого слова method и ничем от подпрограммы не отличаются. Я имею ввиду, в плане синтаксиса.
method hello {
say "Hello!";
}
Чтобы создать закрытый метод, доступный только внутри класса, поставьте ! перед именем метода:
method !hello {
say "Hello!";
}
Работа с закрытыми методами — сплошное удовольствие в Perl 6. К примеру, даже внутри класса, закрытый метод не может быть вызван так: self.hello. Для закрытого метода существует свой синтаксис вызова в Perl6:
self!hello();


0


































