私はMooseに習熟するためのスクリプトを書いています。私は、次のコードビットを持っている:次のエラーでビルド中にro属性を設定するには?
package Dir;
use Moose;
use Modern::Perl;
use File;
has 'dirs' => (is => 'ro', isa => 'HashRef[Dir]');
has 'files' => (is => 'ro', isa => 'HashRef[File]');
has 'dir_class' => (is => 'ro', isa => 'ClassName', default => 'Dir');
has 'file_class' => (is => 'ro', isa => 'ClassName', default => 'File');
sub BUILD {
my $self = shift;
my $path = $self->path;
my $name = $self->name;
my (%dirs, %files);
# populate dirs attribute with LaborData::Data::Dir objects
opendir my $dh, $path or die "Can't opendir '$path': $!";
# Get files and dirs and separate them out
my @dirs_and_files = grep { ! m{^\.$|^\.\.$} } readdir $dh;
closedir $dh or die "Can't closedir '$path': $!";
my @dir_names = grep { -d "$path/$_" } grep { !m{^\.} } @dirs_and_files;
my @file_names = grep { -f "$path/$_" } grep { !m{^\.} } @dirs_and_files;
# Create objects
map { $dirs{$_} = $self->dir_class->new (path => $path . '/' . $_) } @dir_names;
map { $files{$_} = $self->file_class->new (path => $path . '/' . $_) } @file_names;
# Set attributes
$self->dirs (\%dirs);
$self->files (\%files);
}
コード結果:died: Moose::Exception::CannotAssignValueToReadOnlyAccessor (Cannot assign a value to a read-only accessor at reader Dir::dirs
このエラーを回避するために、私が作ることができるのいずれかの属性rw
またはdirs
ためbuilder
メソッドを使用します属性はfiles
です。前者の解決法は望ましくなく、後者の解決法はコードの重複を必要とする(例えば、ディレクトリを2回開く必要がある)ので、また望ましくない。
この問題の最適な解決策は何ですか?
「StevensPerlTools」が何をしているのだろうか。 :) – simbabque