2017-12-11 5 views
-1

私はMooseを使ってPerlでオブジェクト指向クラスを作成しています。ムースでライターメロンなしの属性のみが読み込まれる

私はこのように宣言した私は、読み取り専用にしたい属性の数があります

package BioIO::SeqIO; 
use Moose; 
use namespace::autoclean; 
use MooseX::StrictConstructor; 
use MooseX::Types::Moose qw(ArrayRef HashRef Int Str); 
use FinalTypes::MyTypes qw(FileType); 

has '_gi'  => (isa  => ArrayRef, 
        is  => 'ro', 
        init_arg => undef, 
        writer => '_writer_gi'); 

私もこのようになりますBUILDER方法があります。

sub BUILD { 
    # Confessing with usage string if incorrect number of arguments used. 
    @_ == 2 or confess getErrorString4WrongNumberArguments(); 
    # Initializing local variable with subroutine input. 
    my ($self) = @_; 
    # Creating BioIO::SeqIO object for GenBank or FASTA file. 
    $self->fileType =~ /genbank/i ? $self->_getGenbankSeqs() : $self->_getFastaSeqs(); 
} 

を私のコードは問題なく動作しますが、次のテストで警告が表示されます:

dies_ok {BioIO::SeqIO->new(filename => $fileNameIn, fileType => 'fasta', => _gi => [])}  '... dies when _gi sent to BioIO::SeqIO constructor'; 

ここはwarniですNG:

Use of uninitialized value $gi in hash element at BioIO/SeqIO.pm line 256, <$fh> chunk 1. 

最後に、ここではそのエラーの行256です:

$hashDef{$gi} = $def; 

私は、ユーザーが書き込みしようとするとプログラムは、すぐに死んでされていないため、警告を得ていると思います_gi、しかし、私はこれを確実にする方法を知らない?属性定義で

+2

この不十分な質問で私たちがどのようにお手伝いできるか分かりません。それが見つかった文脈なしにエラーが発生した行を示すポイントはありません。 '$ gi'はどこから来たのですか? –

+0

モジュール 'BioIO :: SeqIO'を使うのは悪い考えです。これはCPANモジュール 'Bio :: SeqIO'には似ていますが、その機能については分かりません。 – Borodin

答えて

0

、すなわち、削除、init_argがundefをに設定されていることに注意してください:

has '_gi'  => (isa  => ArrayRef, 
        is  => 'ro', 
        init_arg => undef, 
        writer => '_writer_gi'); 

のinit引数は、コンストラクタ呼び出しの引数の名前です。 undefに設定されているので、コンストラクタで初期化することはできませんが、writerメソッド(ここでは_writer_giという内部メソッドが作成されます)を介してのみ初期化できます。

関連する問題