【发布时间】:2017-02-04 19:05:15
【问题描述】:
我正在编写一个脚本来帮助我精通 Moose。我有以下代码:
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 和 files 属性使用 builder 方法。前一种方案不可取,后一种方案需要重复代码(例如,目录需要打开两次),因此也不可取。
这个问题的最佳解决方案是什么?
【问题讨论】:
-
我想知道
StevensPerlTools做了什么。 :)