如何从类方法中访问Moose属性?

Gau*_*nia 3 oop perl moose

请考虑以下代码:

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.