Moose: builder требует значение, которое иногда не устанавливается (недетерминированное) - PullRequest
3 голосов
/ 03 мая 2019

Я новичок в MOOSE и Perl OOP, и я изо всех сил пытаюсь понять порядок выполнения кода.

Я хочу создать файлы для чтения классов, поэтому атрибутом объекта должен быть дескриптор файла, а другим - имя файла для чтения.

Моя проблема заключается в том, что атрибут 'дескриптор файла' имеетКонструктор, которому требуется $ self-> filename, но иногда во время выполнения имя файла (пока) недоступно при вызове компоновщика.

Спасибо за помощь

Создание моего идеального объекта:

my $file = FASTQ::Reader->new(
    filename => "$Bin/test.fastq",
);

Модуль Perl:

has filename => (
    is => 'ro',     isa => 'Str',     required => 1,
);

has fh => (
  is => 'ro',   isa => 'FileHandle',   builder => '_build_file_handler',
);

sub _build_file_handler {
   my ($self) = @_;
   say Dumper $self;
   open(my $fh, "<", $self->filename) or die ("cant open " . $self->filename  . "\n");
   return $fh;
}

См .: https://gist.github.com/telatin/a81a4097913af55c5b86f9e01a2d89ae

1 Ответ

4 голосов
/ 03 мая 2019

Если значение одного атрибута зависит от другого атрибута, сделайте его ленивым.

#!/usr/bin/perl
use warnings;
use strict;

{   package My::Class;
    use Moose;

    has filename => (is => 'ro', isa => 'Str', required => 1);
    has fh => (is => 'rw', isa => 'FileHandle', lazy => 1, builder => '_build_fh');
    #                                           ~~~~~~~~~

    sub _build_fh {
        my ($self) = @_;
        open my $fh, '<', $self->filename or die $!;
        return $fh
    }
}

my $o = 'My::Class'->new(filename => __FILE__);
print while readline $o->fh;

См. Laziness in Moose :: Manual :: Attributes :

если значение по умолчанию для этого атрибута зависит от некоторых других атрибутов, то атрибут должен быть lazy.

...