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

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

11.08.2008 15:57:35
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, но они не так полны, но без большинства затрат времени компиляции.

23
15.07.2009 04:48:37
или мышь, если вам нужны простые функции Moose
Alexandr Ciornii 26.10.2008 23:12:19
Есть ли хороший учебник для новичков на лося? спасибо
melaos 22.12.2008 14:35:31
@ Александр, спасибо обновил ответ. @ melaos Я отредактировал ответ, чтобы предоставить ссылки
Pat 29.12.2008 10:57:53
Очистил некоторые ссылки уценки и изменил Moose::Introна Moose::Cookbook.
Brad Gilbert 15.07.2009 04:49:50
Лучшее введение в Мус я видел на Catalyzed.org: catalyzed.org/2009/06/a-gentle-introduction-to-moose.html Даже как опытный программист Perl, я избегал Лося на некоторое время , потому что казалось запутанным ,
Drew Stephens 18.09.2009 00:12:44

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

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

3
11.08.2008 17:12:07
Обратите внимание, что все учебные пособия по perldoc также доступны в командной строке, если у вас есть нормальная установка Perl: perldoc perltoot для этого. (Смотрите также perldoc perlboot для большего удовольствия от объектов в Perl.)
Telemachus 27.06.2009 15:13:24

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

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

5
31.08.2008 11:45:00

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

5
15.09.2008 16:41:41

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

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, но этот работает.

8
16.09.2008 19:02:42

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

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

1
1.12.2008 03:22:45

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

2
26.07.2010 22:55:28