Поля
СОДЕРЖАНИЕ
НАЗВАНИЕ
fields - поля класса на этапе компиляции
СИНОПСИС
{
package Foo;
use fields qw(foo bar _Foo_private);
sub new {
my Foo $self = shift;
unless (ref $self) {
$self = fields::new($self);
$self->{_Foo_private} = "this is Foo's secret";
}
$self->{foo} = 10;
$self->{bar} = 20;
return $self;
}
}
my $var = Foo->new;
$var->{foo} = 42;
# this will generate a run-time error
$var->{zap} = 42;
# this will generate a compile-time error
my Foo $foo = Foo->new;
$foo->{zap} = 24;
# subclassing
{
package Bar;
use base 'Foo';
use fields qw(baz _Bar_private); # not shared with Foo
sub new {
my $class = shift;
my $self = fields::new($class);
$self->SUPER::new(); # init base fields
$self->{baz} = 10; # init own fields
$self->{_Bar_private} = "this is Bar's secret";
return $self;
}
} ОПИСАНИЕ
Предикат fields позволяет проверять поля класса на этапе компиляции и выполнения.
ПРИМЕЧАНИЕ: Текущая реализация сохраняет объявленные поля в хеше %FIELDS вызывающего пакета, но это может измениться в будущих версиях. Не изменяйте хеш %FIELDS напрямую, поскольку он должен создаваться на этапе компиляции для полной работоспособности, как это делает данный предикат.
Если используется типизированная лексическая переменная (my Class $var) содержащая ссылку для доступа к элементу хеша, и пакет с таким же именем, как и тип, объявил поля класса с помощью этого предиката, то ключ хеша проверяется на этапе компиляции. Если переменные не типизированы, доступ проверяется только во время выполнения.
Связанный предикат base объединит поля из базовых классов и любые поля, объявленные с помощью предиката fields. Это позволяет правильно работать с наследованием полей. Наследуемые поля могут быть переопределены, но при включенных предупреждениях будет выведено предупреждение.
Только для Perl 5.8.x и более ранних версий: Имена полей, начинающиеся с символа подчеркивания, делают поле приватным для класса и не видны подклассам.
Также, в Perl 5.8.x и более ранних версиях, этот предикат использует псевдо-хеши, что позволяет создавать объекты с именованными полями, которые так же компактны и быстры в доступе, как массивы, при условии, что к объектам обращаются через соответствующие типизированные переменные.
Поддерживаются следующие функции:
- new
-
fields::new() создаёт и благословляет хеш, содержащий поля, объявленные с помощью предиката
fieldsв указанном классе. Это рекомендуемый способ создания объекта на основе полей.Это позволяет написать конструктор так:
package Critter::Sounds; use fields qw(cat dog bird); sub new { my $self = shift; $self = fields::new($self) unless ref $self; $self->{cat} = 'meow'; # scalar element @$self{'dog','bird'} = ('bark','tweet'); # slice return $self; } - phash
-
Эта функция работает только в Perl 5.8.x и более ранних версиях. Псевдо-хеши были удалены из Perl начиная с версии 5.10. Рассмотрите использование ограниченных хешей или fields::new() вместо этого (который сам использует ограниченные хеши под 5.10+). См. Hash::Util. Использование fields::phash() под 5.10 или выше вызовет ошибку.
fields::phash() может использоваться для создания и инициализации простого (неблагословенного) псевдо-хеша. Эта функция всегда должна использоваться вместо прямого создания псевдо-хешей.
Если первый аргумент — ссылка на массив, псевдо-хеш будет создан с ключами из этого массива. Если указан второй аргумент, он также должен быть ссылкой на массив, элементы которого будут использоваться в качестве значений. Если второй массив содержит меньше элементов, чем первый, хвостовые элементы псевдо-хеша не будут инициализированы. Это делает его особенно полезным для создания псевдо-хеша из аргументов подпрограммы:
sub dogtag { my $tag = fields::phash([qw(name rank ser_num)], [@_]); }fields::phash() также принимает список пар ключ-значение, которые будут использованы для построения псевдо-хеша. Примеры:
my $tag = fields::phash(name => "Joe", rank => "captain", ser_num => 42); my $pseudohash = fields::phash(%args);
СМОТРИТЕ ТАКЖЕ
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/fields