在Moose中没有编写者方法的只读属性

时间:2017-12-11 14:29:12

标签: perl moose

我正在使用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';

这是警告:

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

最后,这是错误的第256行:

$hashDef{$gi} = $def;

我认为我收到警告是因为一旦用户尝试写入_gi,程序就不会死,但是,我不知道如何确保这种情况发生?

1 个答案:

答案 0 :(得分:0)

在属性定义中,请注意Instant设置为undef,即已删除:

public void testInstant(){
    Instant now = Instant.now();
    ZonedDateTime utc = now.atZone(ZoneId.of("UTC"));

    ZonedDateTime zonedDateTime = utc.withHour(19)
            .withMinute(0)
            .withSecond(0);

    Instant instant = zonedDateTime.toInstant();
}

init arg是构造函数调用中参数的名称。因为它设置为undef,所以不能通过构造函数初始化它,而只能通过writer方法(这里创建一个名为init_arg的内部方法)。