Perl 与子类共享变量



我知道这可能是一个非常简单的话题,但我试图获得最佳逻辑,因为我仍然是Perl的新手。

如果我不使用 OO 而只是将代码拆分为文件,则在所有文件中访问所有全局变量。

我正在尝试做同样的事情,但使用 OO 样式。例如,我想要一个名为"BaseSub"的基类,它有一个包含应用程序配置的哈希值,例如名为 %Config。现在我有一个名为"DB"的子类用于数据库连接,我想从位于"BaseSub"包中的 %Config 访问设置。我该怎么做。

如果你在这个时代写OO perl,你真的应该使用Moose。它使OO代码更容易,更清晰,更小。

继承变量的正确方法是创建对象属性。下面是一个快速示例:

package MyBaseClass;
use Moose; 
has config => (
    is => 'ro',
    default => sub { {
        who => 'World',
    } }
);
package MyClass;
use Moose;
extends qw(MyBaseClass);
sub greet
{
    my $self = shift;
    printf("Hello %s!n", $self->config->{who});
}
package main;
my $object = MyClass->new();
$object->greet();
了解驼鹿

的一个很好的起点是驼鹿::手册。

编辑:

如果您希望能够修改配置,您可以直接戳从配置访问器返回的 hashref:

$object->config->{who} = 'Friends';

但更好的方法可能是创建一个配置类并使 config 属性包含该类的实例:

package Myconfig;
use Moose;
has who => (is => 'rw', default => 'World');
package MyBaseClass;
use Moose;
has config => (
    is => 'ro',
    isa => 'MyConfig',
    default => sub { MyConfig->new },
);
# inherit, instantiate, etc as before...
$object->config->who('Friends');

另一种方法是Moose::Meta::Attribute::Native::Trait::Hash,这使得设置帮助程序方法来处理原生Perl数据类型变得容易。

使用其全名。

for (keys(%BaseSub::Config)) {
    print("$_: $BaseSub::Config{$_}n");
}

您也可以导入它。

our %Config; *Config = %BaseSub::Config;
for (keys(%Config)) {
    print("$_: $Config{$_}n");
}

最新更新