2012-05-11 5 views
2

属性のライターメソッドへの参照を別のクラスメソッドに渡そうとしています。 printステートメントが実行されているので、setterメソッドが呼び出されたようです。ただし、次のエラー結果:属性のライターメソッドへの参照を呼び出すときのPerlムース例外

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 

生成ライター・メソッドへの参照を取ることができないか、ムースでこれを行うために異なるか良い方法がある理由はありますか?ここで

はコードです:

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

はそれが右の定期的なサブとしてのセッターを呼び出すことですか?最初の引数として$selfを渡すべきではありませんか?

+0

それは問題だった - 良いキャッチ! – roadrider

+0

私は今あなたの答えを元に戻しました...たぶんあなたはコメントのように見えるように(再び)削除されないように言い換えてください。また興味深い読んだ:http://meta.stackexchange.com/questions/131959/should-i-not-flag--reritorical-question-posted-as-an-answer – BoltClock

+0

ああ、ありがとう!私は、明らかに答えの試みである修辞的な質問を削除するように、言語についてあまりにも肛門性にすべきだとは思わない。 – zoul

1

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

&$setter($self, $dir); 

あるいは、($setterはコードの参照が、より慣用的であると等価):

$self->$setter($dir); 

あなたが得る理由「属性(DIR)が必要ですので、undefをに設定することはできませんが」ということですPerlは、$dirがオブジェクトであり、値が見つからないと考えて(したがってundef)、それは明らかにそのチェックが行われてから、$dirがオブジェクトではないことに気づきます。

関連する問題