Как вы создаете объекты в Perl?

Perl имеет возможности ООП, но они используются довольно редко. Как вы создаете и используете объекты Perl с методами и свойствами?

Ответов (7)

Решение

Вам обязательно стоит взглянуть на Moose.

package Point;
use Moose; # automatically turns on strict and warnings

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

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

Moose предоставляет вам (среди прочего) конструктор, методы доступа и проверку типов бесплатно!

Итак, в вашем коде вы можете:

my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15);     # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5);   # FAILS! Free type check.

Хорошая отправная точка - Moose::ManualиMoose::Cookbook

Если вам просто нужны базовые вещи, вы также можете использовать, Mouseчто не так полно, но без больших затрат времени на компиляцию.

Объекты Perl - это НЕ просто благословенные хэши. Это благословенные ССЫЛКИ. Они могут быть (и чаще всего являются) благословенными хэш-ссылками, но с тем же успехом они могут быть благословенными скалярными ссылками или ссылками на массивы.

Официальный учебник на сайте CPAN хорош.

Также на CodeProject есть хорошая статья под названием Camel POOP .

В настоящее время я использую Object :: InsideOut всякий раз, когда мне нужны объекты, это довольно приятно и даст вам много возможностей по сравнению со стандартными благословенными хеш-объектами. При этом, если бы я начинал новый проект, я бы серьезно посмотрел на Moose.

Хотя хорошо читать официальную документацию PERL, я бы НЕ рекомендовал пытаться использовать свою собственную объектную структуру или строить объекты с использованием хэшей, это очень соблазнительно пойти по легкому пути и «перейти» непосредственно к «частным» переменным объектов. полностью нарушая инкапсуляцию, это вернется, чтобы укусить вас, когда вы захотите реорганизовать объект.

Лось , определенно.

package Person;
use Moose;
has age => ( isa => Int, is => 'rw'); 
has name => ( isa => Str, is => 'rw'); 
1;

Сразу же у вас есть бесплатный метод new () и методы доступа для атрибутов, которые вы только что определили с помощью 'has'. Итак, вы можете сказать:

my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";

и так далее. Не только это, но и ваши методы доступа проходят бесплатную проверку типа (и вы можете определять свои собственные типы, а также стандартные). Кроме того, вы получаете «extends» для создания подклассов, «with» для ролей / черт и всевозможные другие замечательные вещи, которые позволяют вам продолжить настоящую работу по написанию хорошего, надежного и поддерживаемого объектно-ориентированного кода.

TMTOWTDI, но этот работает.

На одной ноге каждый класс - это пакет; вы устанавливаете (множественное, при желании) наследование, устанавливая переменную пакета @ISA (желательно во время компиляции); вы создаете объект из существующей части данных (часто, но не всегда, анонимный хэш, используемый для хранения переменных экземпляра) с помощью bless (REFERENCE [, CLASSNAME]); вы вызываете методы объекта, такие как $ obj-> methodname (@ARGS), и методы класса, такие как «CLASSNAME» -> methodname (@ARGS). Порядок разрешения методов множественного наследования можно изменить с помощью mro .

Поскольку это несколько минималистично и не требует инкапсуляции, существует много разных модулей, которые предоставляют больше или разные функции.

Я настоятельно рекомендую взглянуть на Moose, если вы хотите выполнять объектно-ориентированную разработку на Perl. Однако это не очень полезно, если вы не понимаете, что означает объектно-ориентированный объект в Perl. Чтобы лучше понять, как Perl OO работает под капотом, я написал обзор в своем блоге: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriated-perl/

С точки зрения структуры данных объект является ссылкой с несколькими дополнительными функциями. Интерпретатор знает, что нужно рассматривать эти специальные ссылки как объекты, потому что они были «благословлены» ключевым словом «bless». Благословенные ссылки содержат флаг, указывающий, что они являются Объектами. По сути, это означает, что вы можете определять и вызывать для них методы.

Например, если вы создали базовый хэш-адрес, это не сработает: $ hashref-> foo ();

Но если вы создадите благословенный хэш-адрес (он же объект), это действительно сработает: $ blessed_hashref-> foo ();

Moose - отличный модуль для ООП в Perl, потому что он создает обязательный объектно-ориентированный слой и автоматически обрабатывает методы доступа, поэтому вам не нужно определять кучу геттеров и сеттеров. Если вы заинтересованы в использовании Devel :: Peak, чтобы увидеть, как интерпретатор Perl хранит объекты, перейдите по ссылке на запись в блоге, которую я разместил выше.