gpt4 book ai didi

perl - 在 Perl/Moose 中,如何在父类中创建可从子类访问的静态变量?

转载 作者:行者123 更新时间:2023-12-02 05:34:26 24 4
gpt4 key购买 nike

我想在基类中定义一个所有子类都可以读取和写入的“注册表”散列,我如何使用 Moose/Perl 完成此操作?

最佳答案

这是一个使用普通 Perl OO 风格的实现。

您有两个类,BaseClass 和全局变量 $REGISTRY,以及继承自 BaseClassDerivedClass$REGISTRY 可通过 registry() 方法从任何类实例读取和写入。

#!/usr/bin/env perl

use 5.012;
use strict;

package BaseClass;

our $REGISTRY = {};

sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}

sub registry {
my $self = shift;
return $REGISTRY;
}

package DerivedClass;

push our @ISA, 'BaseClass';

package main;

my $base = BaseClass->new;
$base->registry->{ alpha } = 1;

my $derived = DerivedClass->new;
$derived->registry->{ beta } = 2;

say $_, ' -> ', $base->registry->{ $_ } foreach keys %{ $base->registry };

如果你运行这个程序你会得到:

alpha -> 1
beta -> 2

如果您更喜欢全 Moose 解决方案,您应该试试这个:

#!/usr/bin/env perl

use 5.012;
use strict;

package BaseClass;
use Moose;

our $_REGISTRY = {};
has '_REGISTRY' => (
is => 'rw',
isa => 'HashRef',
default => sub { return $_REGISTRY }
);

sub registry {
my $self = shift;
return $self->_REGISTRY;
}

__PACKAGE__->meta->make_immutable;
no Moose;

package DerivedClass;
use Moose;

use base 'BaseClass';

__PACKAGE__->meta->make_immutable;
no Moose;

package main;

my $base = BaseClass->new;
$base->registry->{ alpha } = 1;

my $derived = DerivedClass->new;
$derived->registry->{ beta } = 2;

say $_, ' -> ', $base->registry->{ $_ } foreach keys %{ $base->registry };

它产生与 OO Perl 程序相同的结果。请注意 _REGISTRY 属性是如何定义的。 Moose 不喜欢将 refs 作为默认值:default => {} 被禁止,您必须将任何引用作为返回值包装在匿名子例程中。

关于perl - 在 Perl/Moose 中,如何在父类中创建可从子类访问的静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7422043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com