Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вы должны обязательно взглянуть на 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, который не является таким полным, но без большей части времени компиляции.

Ответ 2

Moose, определенно.

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" для подкласса, "с" для ролей/черт и всех других полезных вещей, которые позволяют вам справиться с реальной работой по написанию хорошего надежного поддерживаемого OO-кода.

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Но если вы создадите благословенный hashref (aka Object), это сработает: $ Blessed_hashref- > Foo();

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

Ответ 7

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

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