【问题标题】:Perl share variables with subclassesPerl 与子类共享变量
【发布时间】:2014-02-25 20:21:56
【问题描述】:

我知道这可能是一个非常简单的话题,但由于我还是 Perl 的新手,所以我正在努力获得最佳逻辑。

如果我不使用 OO 并且只是将代码拆分为文件,则所有文件之间都会访问所有全局变量。

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

【问题讨论】:

  • 你有任何代码你目前正在工作吗?

标签: perl


【解决方案1】:

如果您在这个时代编写 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();

了解 Moose 的一个很好的起点是Moose::Manual

编辑:

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

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

但更好的方法可能是创建一个配置类并让配置属性保存一个实例:

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 数据类型。

【讨论】:

  • 好,我怎样才能使配置属性成为一个动态哈希,也可以作为一个动态数组,我可以从基类甚至子类进行更改。
  • 更新了我的答案以包含有关制作可修改配置属性的建议。
  • Moose 是否默认安装在托管域上,因为它不是标准 Perl 模块,还是我必须要求他们将它安装在服务器上?
【解决方案2】:

使用它的全名。

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

你也可以导入它。

our %Config; *Config = \%BaseSub::Config;

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

【讨论】:

  • for (keys %Config)?
猜你喜欢
  • 2011-02-09
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 2014-10-13
相关资源
最近更新 更多