Pull to refresh

Атрибуты: введение

Perl *
Атрибуты появились в Perl довольно давно. Знаменательная для старожилов версия Perl 5.005 содержала довольно бесполезную прагму attrs. Прагма эта позволяла навесить на функцию пару встроенных атрибутов, для чего требовалось указать внутри этой функции use attrs с соответствующими параметрами. Правда, уже в марте 2000 года в Perl 5.6 эта прагма была объявлена deprecated. На замену ей пришел модуль attributes, а также расширенный синтаксис для объявления переменных/функций. Стало возможным создавать для них собственные метки и вводить для этих меток обработчики. По непонятным причинам, популярность атрибуты так и не получили. А жаль.

Ближе к сути


Сейчас их наверняка назвали бы не атрибутами, а тегами. Выглядит все просто — к объявляемой переменной или функции можно дописать несколько меток. Есть несколько стандартных для Perl атрибутов, но можно вводить и свои собственные. Встроенные атрибуты записываются строчными буквами, и потому использовать такой регистр для пользовательских меток не рекомендуется — во избежание накладок в будущем и варнингов в настоящем.

Синтаксис атрибутов достаточно понятен:

my $myVar : myAttribute = 10;
sub mySub : myAttribute1 : myAttribute2 {:}


Интерпретатор не накладывает ограничений на наличие пробела между двоеточием и названием атрибута, лично мне кажется более наглядным, когда они записаны слитно.

Атрибуты можно навешивать на функции и на переменные — скаляры, хеши, массивы.

Для чего это нужно


За примерами ходить недалеко — на CPAN живет группа модулей, объединенных под именем Attribute::Util. Я не буду комментировать возможность их применения в реальных проектах, но как простая и наглядная иллюстрация — это то, что нужно.

Первый из них, Attribute::Abstract, предлагает замену для классического описания абстрактных методов. Обратите на него внимание, если у вас есть подобные объявления:

sub myMethod { die "Abstract method called!"; }

Предлагаемый им синтаксис гораздо нагляднее:

sub myMethod: Abstract;

Второй класс, Attribute::Memoize, позволяет добавить кеширование к функциям, которые возвращают постоянный результат для одинаковых наборов аргументов. Конечно, завернуть код функции в if-блок труда не составит, но опять же — можно просто пометить функцию атрибутом :Memoize и знать, что ее результат кешируется.

Третий класс, Attribute::Method, позволяет избавиться от написания первой строки практически любого метода:

my $self = shift;

Просто ставим к методу атрибут :Method, и $self появляется сам собой. Кроме того, можно указать, какие аргументы переданы методу — тогда они тоже будут проинициализированы:

sub myMethod :Method($x) { print "self=$self, x=$x\n" }

Интересно? Тогда не забудьте заглянуть в исходный код модулей.

UPD: продолжение статьи: Атрибуты: взгляд внутрь
Tags:
Hubs:
Total votes 46: ↑42 and ↓4 +38
Views 2.3K
Comments Comments 31