Как вы создаете объекты в Perl? - PullRequest
12 голосов
/ 11 августа 2008

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

Ответы [ 7 ]

23 голосов
/ 12 августа 2008

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

8 голосов
/ 16 сентября 2008

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

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";

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

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

5 голосов
/ 15 сентября 2008

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

5 голосов
/ 31 августа 2008

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

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

3 голосов
/ 11 августа 2008

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

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

2 голосов
/ 27 июля 2010

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

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

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

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

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

1 голос
/ 01 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...