stringtranslate.com

Лось (Perl)

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

Функции

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

Классы

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

Атрибуты

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

Роли

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

Расширения

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

Примеры

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

пакет Точка ; использовать Лося ; использовать Карпа ;   имеет 'x' => ( isa => 'Num' , is => 'rw' ); имеет ' y' = > ( isa => 'Num' , is => 'rw' );                подчистка { мой $self = сдвиг ; $self -> x ( 0 ) ; $self -> y ( 0 ); }        sub set_to { @_ == 3 или квакает "Неправильное количество аргументов" ; my $self = shift ; my ( $x , $y ) = @_ ; $self -> x ( $x ); $self -> y ( $y ); }                   пакет Point3D ; использовать Moose ; использовать Carp ;   расширяет «Точку» ; имеет 'z' => ( isa => 'Num' , is => 'rw' );        после 'clear' => sub { my $self = shift ; $self -> z ( 0 ); };         sub set_to { @_ == 4 или квакает "Неправильное количество аргументов" ; my $self = shift ; my ( $x , $y , $z ) = @_ ; $self -> x ( $x ); $self -> y ( $y ); $self -> z ( $z ); }                     

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

То же самое с использованием MooseX::Declareрасширения:

использовать MooseX::Declare ; класс Point { имеет 'x' => ( isa => 'Num' , is => 'rw' ); имеет 'y' => ( isa => 'Num' , is => 'rw' ); метод clear { $self -> x ( 0 ); $self -> y ( 0 ); } метод set_to ( Num $x , Num $y ) { $self -> x ( $x ); $self -> y ( $y ); } }                                     класс Point3D расширяет Point { has 'z' => ( isa => 'Num' , is => 'rw' );              после очистки { $self -> z ( 0 ); } метод set_to ( Num $x , Num $y , Num $z ) { $self -> x ( $x ); $self -> y ( $y ); $self -> z ( $z ); } }                 

Смотрите также

Ссылки

  1. ^ "Moose - Постмодернистская объектная система для Perl" . Получено 2017-03-06 .
  2. ^ Расширения Moose на CPAN
  3. ^ Задача::Лось

Внешние ссылки