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

标签 perl static moose

我想在基类中定义一个所有子类都可以读取和写入的“注册表”散列,我如何使用 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/

相关文章:

perl - 与 Perl 6 序列任意 (...) 运算符的乘法

linux - 如何在linuxexpect脚本中传递perl形式的参数?

C - 如何保持变量

java - 访问静态最终实例变量进入静态方法错误

perl - 如何从Moose构造函数报告错误?

linux - 不断将 Linux 命令的输出写入文件

python - 如何将现有脚本集成到 Django 中?

design-patterns - 充满静态方法的类的设计注意事项

perl - Moose 对象初始化后如何创建结构?

perl - 为什么 Moose 的构建器采用字符串值?