繁体   English   中英

Moose:将参数注入构造

[英]Moose: injecting parameters into construction

我有一个附加了验证的文件名属性。 现在,当在构造过程中未指定文件名时,我想从配置文件中读取它。

subtype 'filename'
        => as 'Str'
        => where { -r $_ }
        => message { "$_ is not a readable file" };

has 'students_file' => ( is => 'rw', isa => 'filename', default => '' );
has 'teachers_file' => ( is => 'rw', isa => 'filename', default => '' );

问题是BUILD似乎在验证发生后运行。 BUILDARGS的所有示例似乎都处理了构建 object 的不同方式。

那么我应该在哪里读取配置并设置属性呢?

提供从配置文件设置它们的teachers_file文件和students_file文件builder方法(或内联default子程序)。 仅当这些属性作为构造函数的键提供时,构建器才会运行(除非您使用init_arg => undef来防止它们在构造函数中设置)。

如果您的配置是它自己的属性,并且具有读取配置文件的构建器,那么您在configteachers_filestudents_file之间存在排序问题。 你可以通过设置teachers_filestudents_file惰性属性来解决这个问题,这样可以确保它们不会在 config 属性之前被构造。 但是,您可能希望确保在构造过程中尽早抛出“foo is not a readable file”错误,而不是在第一次使用属性时抛出。 您可以通过添加来解决这个问题

sub BUILD {
  my $self = shift;
  $self->teachers_file;
  $self->students_file;
}

这确保在构造函数返回之前读取一次(并构造)这些属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM