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

В предыдущих сериях мы познакомились с переменными, блоками и выражениями, циклами и подпрограммами. Исходя уже из этих постов, можно делать всяческие выводы, нужен ли 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();

shootnix
shootnix
12 августа 2009, 01:35
 0  
просмотров
978
3
 
Чтобы оставлять комментарии, Вы должны быть авторизованы. Если у Вас нет логина, то пройдите регистрацию.
участники
shootnix
Rex
edmond-mouse
mikusya
Legend_FoX
PeterWilson
askhattk
barmaglot
wwax
tima888
t-sh
Sigurt
zloyrusskiy
goodev
10275
PILIGRIM
войти
зарегистрироваться
сообщества
последние записи
записи по обсуждениям
записи по рейтингу
создать новое сообщество
личные блоги
последние записи
записи по обсуждениям
люди
самые активные
новые
по городам
по интересам
блог проекта
правила участия
помощь
мы на других сайтах
реклама
конкурсы
контакты
WebEverywhere, 2008-2010

Lyakhov.KZ - Большая энциклопедия Казнета Lyakhov.KZ - Большая энциклопедия Казнета