Поля
СОДЕРЖАНИЕ
ИМЯ
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–2023 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.38.0/fields