Spec-Zone.ru › Perl 5.32

Поля

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • СИНТАКСИС
  • ОПИСАНИЕ
  • СМОТРИТЕ ТАКЖЕ

НАЗВАНИЕ

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);

СМОТРИТЕ ТАКЖЕ

base, Hash::Util

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API