我正在使用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,程序就不会死,但是,我不知道如何确保这种情况发生?
答案 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
的内部方法)。