Поля
СОДЕРЖАНИЕ
НАЗВАНИЕ
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–2020 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.32.0/fields