Jump to content

Лось (Perl)

(Перенаправлено с Moose Perl )

Moose — это расширение объектной системы Perl языка программирования . Его заявленная цель [1] Целью является привнести в Perl 5 современные возможности объектно-ориентированного языка и сделать объектно-ориентированное программирование на Perl более последовательным и менее утомительным.

Moose построен на основе Class::MOP, протокола метаобъектов ( он же MOP). Используя MOP, Moose обеспечивает полный самоанализ всех классов, использующих Moose.

Moose позволяет программисту создавать классы :

Атрибуты

[ редактировать ]

Атрибут — это свойство класса, которое его определяет.

Роли в Moose основаны на чертах характера . Они выполняют ту же задачу, что и миксины , но формируются горизонтально, а не наследуются. Они также чем-то похожи на интерфейсы , но в отличие от некоторых реализаций интерфейсов могут предоставлять реализацию по умолчанию. Роли можно применять как к отдельным экземплярам, ​​так и к классам.

  • Роль имеет ноль или более атрибутов.
  • Роль имеет ноль или более методов.
  • Роль имеет ноль или более модификаторов методов.
  • Роль имеет ноль или более обязательных методов.

Расширения

[ редактировать ]

имеется ряд модулей расширения Moose На CPAN . По состоянию на сентябрь 2012 г. в пространстве имен MooseX имеется 855 модулей в 266 дистрибутивах. [2] Большинство из них можно дополнительно установить с помощью модуля Task::Moose. [3]

Это пример класса Point и его подкласс Point3D:

package Point;
use Moose;
use Carp;

has 'x' => (isa => 'Num', is => 'rw');
has 'y' => (isa => 'Num', is => 'rw');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

sub set_to {
    @_ == 3 or croak "Bad number of arguments";
    my $self = shift;
    my ($x, $y) = @_;
    $self->x($x);
    $self->y($y);
}

package Point3D;
use Moose;
use Carp;

extends 'Point';

has 'z' => (isa => 'Num', is => 'rw');

after 'clear' => sub {
    my $self = shift;
    $self->z(0);
};

sub set_to {
    @_ == 4 or croak "Bad number of arguments";
    my $self = shift;
    my ($x, $y, $z) = @_;
    $self->x($x);
    $self->y($y);
    $self->z($z);
}

Есть новый set_to() метод в Point3D класс, поэтому метод с тем же именем, определенный в Point класс не вызывается в случае Point3D экземпляры. clear() с другой стороны, не заменяется, а расширяется в подклассе, поэтому оба метода выполняются в правильном порядке.

Это то же самое, используя MooseX::Declare расширение:

use MooseX::Declare;

class Point {
    has 'x' => (isa => 'Num', is => 'rw');
    has 'y' => (isa => 'Num', is => 'rw');
    
    method clear {
        $self->x(0);
        $self->y(0);
    }
    method set_to (Num $x, Num $y) {
        $self->x($x);
        $self->y($y);
    }
}

class Point3D extends Point {
    has 'z' => (isa => 'Num', is => 'rw');

    after clear {
        $self->z(0);
    }
    method set_to (Num $x, Num $y, Num $z) {
        $self->x($x);
        $self->y($y);
        $self->z($z);
    }
}

См. также

[ редактировать ]
  1. ^ «Moose — постмодернистская объектная система для Perl» . Проверено 6 марта 2017 г.
  2. ^ Расширения Moose на CPAN
  3. ^ Задача::Лось
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: e4acd099060890e46f73a421a76261b3__1718677980
URL1:https://arc.ask3.ru/arc/aa/e4/b3/e4acd099060890e46f73a421a76261b3.html
Заголовок, (Title) документа по адресу, URL1:
Moose (Perl) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)