请考虑以下代码:
package Test1;
use Moose;
has 'something' => (
is => 'rw',
default => 'BLAH!'
);
sub printSomething {
my ($self) = @_;
## What should I use here to get the value of something?
print $self->something;
}
package Test2;
Test1->printSomething();
Run Code Online (Sandbox Code Playgroud)
怎么printSomething访问something?
fri*_*edo 16
它不能.您必须实例化一个Test1对象才能构造属性默认值.他们不会在课堂上闲逛.
如果你想在Moose中使用真正的类属性,你可以编写一个关闭某些东西并返回它的方法:
{
my $class_attr = 'BLAH!';
sub something {
return $class_attr;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,如果你需要的话,你还需要做更多的工作来添加setter和clearers等等.更好的方法是使用MooseX :: ClassAttribute,如下所示:
package Test1;
use Moose;
use MooseX::ClassAttribute;
class_has 'something' => (
is => 'rw',
default => 'BLAH!'
);
Run Code Online (Sandbox Code Playgroud)
这样做的好处是可以让Moose知道你的class属性,并自动添加meta-introspection goodness.