Perl 扩展Moose类以允许在内部使用不同的类

Perl 扩展Moose类以允许在内部使用不同的类,perl,moose,Perl,Moose,我对Moose和OO编程相当陌生。寻找一些指导。我有以下DirMoose类,它构建了File对象的列表: #!usr/bin/perl package Dir; use Moose; use Modern::Perl; has 'files' => (is => 'rw', isa => 'HashRef[File]' ); <..> sub BUILD { my $self = shift; <..> map {

我对Moose和OO编程相当陌生。寻找一些指导。我有以下
Dir
Moose类,它构建了
File
对象的列表:

#!usr/bin/perl
package Dir;
use Moose;
use Modern::Perl;

has 'files' =>            (is => 'rw', isa => 'HashRef[File]' ); 

<..>

sub BUILD {
  my $self = shift;

<..>

 map { $files{$_} = File->new ( path => $path . '/' . $_ ) } @file_names;
 $self->files ( \%files );

<..>
}
#!usr/bin/perl
package MyDir;
use Moose;
use Modern::Perl;

has 'type' =>  (is => 'ro', isa => 'Str', default => '');
has 'files' => (is => 'rw', isa => 'HashRef[MyFile]' );

我认为Moose可能有办法做到这一点,而无需重写
构建
子例程,但我不确定如何实现这一点。

我通过添加一个新属性找到了一个很好的解决方案:

has 'file_class' => (is => 'ro', isa => 'ClassName', default => 'File');
现在我设置
文件
属性的代码是:

map { $files{$_} = $self->file_class->new ( path => $path . '/' . $_ ) } @file_names;

不要在无效上下文中使用
map
。这只是
循环的
$path
@file\u name
从何而来?删除的内容太多了。我不明白你的类应该做什么。
有'files'=>(is=>'ro',lazy=>1,builder=>'u build_files');子类{…返回{map+($\=>File->new(path=>$path./'.$\'),@File\u names};}
,然后子类可以定义自己的
sub\u build\u文件
。在语义上没有任何内容,但在语法上它将
map
否则会被解释为函数调用的开始,但我希望它是参数的一部分。类似于
print(2+3)*4
(prints 5,将print的返回值乘以4)与
print+(2+3)*4
(prints 20)。我猜这被否决了,因为你仍然以一种奇怪的方式使用
map
。类的方法很好。它非常可扩展。但是你真的应该摆脱
map
,只需执行
$files{$\u}=$self->file\u class->new(…)对于@file_names;
。它更具可读性,而且它没有使用在void上下文中返回值的函数。我被压垮了。我不确定我现在如何继续生活。