调用对属性的writer方法的引用时出现Perl Moose异常

时间:2012-05-11 19:21:14

标签: perl reference moose writer

我试图将对属性的writer方法的引用传递给另一个类方法。自执行print语句以来,显然调用了setter方法。但是,会出现以下错误:

Attribute (dir) is required, so cannot be set to undef at Test.pm line 51
Test::_validateDir('Test=HASH(0x2270be0)', 'CODE(0x22a90f8)') called at test.pm line 37
Test::BUILD('test_moose=HASH(0x2270be0)', 'HASH(0x1879728)') called at generated method (unknown origin) line 50
Test:new('Test', dir=>'my_bin') called at ./test_moose.pl line 26

是否有理由不能采用对生成的编写器方法的引用,或者是否有不同或更好的方法在Moose中执行此操作?

以下是代码:

package Test;
use Moose;
use File::Spec;

has 'dir' => (is => 'ro', isa => 'Str', required => 1, writer '_set_dir',);

sub BUILD {
    my ($self, $hr) = @_;
    $self->_validateDir(\&_set_dir);
}

sub _validate_dir {
    my ($self, $setter) = @_;
    my $dir = File::Spec->rel2abs($self->dir, '/home/me');
    if (! -e $dir) {
       print "creating directory\n";
       #create directory
    }
    &$setter($dir);
}

2 个答案:

答案 0 :(得分:2)

将setter称为常规子是否正确?你不应该将$self作为第一个参数传递吗?

答案 1 :(得分:1)

在Perl中,对方法的引用 not 包含关联的对象。调用引用时,必须提供对象(或类,如果是类方法)作为第一个参数。

&$setter($self, $dir);

或者,(等同于$setter是代码引用但更惯用的时候):

$self->$setter($dir);

你得到“属性(dir)是必需的,因此不能设置为undef”的原因是Perl认为$dir是对象并且值丢失(因此undef),在它注意到$dir不是一个对象之前,它显然会进行检查。