2

属性のライターメソッドへの参照を別のクラスメソッドに渡そうとしています。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);
}
4

2 に答える 2

2

セッターを通常の潜水艦と呼ぶのは正しいですか?$selfあなたは最初の議論として渡すべきではありませんか?

于 2012-05-11T19:43:37.327 に答える
1

Perlでは、メソッドへの参照には関連するオブジェクトは含まれていません。参照を呼び出すときは、最初のパラメーターとしてオブジェクト(またはクラスメソッドの場合はクラス)を指定する必要があります。

&$setter($self, $dir);

$setterまたは、(がコード参照である場合と同等ですが、より慣用的です):

$self->$setter($dir);

「属性(dir)が必要なので、undefに設定できない」と表示される理由は、Perlがそれ$dirがオブジェクトであり、値が欠落している(したがって)と見なし、そうでないundefことに気付く前にチェックを行うためです。$dirオブジェクト。

于 2012-05-11T22:36:02.033 に答える