Все о 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".