Perl 扩展Moose类以允许在内部使用不同的类
我对Moose和OO编程相当陌生。寻找一些指导。我有以下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 {
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上下文中返回值的函数。我被压垮了。我不确定我现在如何继续生活。