如何防止在调用new时设置Perl Moose只读属性?

enn*_*ler 6 perl attributes moose new-operator

我想在Moose中声明一个只读属性,在调用new时无法初始化.在声明以下内容之后:

package SOD::KuuAnalyze::ProdId;

use Moose;

has 'users' => (isa => 'ArrayRef[Str]', is => "ro");

1;
Run Code Online (Sandbox Code Playgroud)

我不希望以下工作:

my $prodid = SOD::KuuAnalyze::ProdId->new(users => ["one", "two"]);
Run Code Online (Sandbox Code Playgroud)

Eth*_*her 13

使用init_arg属性配置(请参阅Moose :: Manual :: Attributes中的 "构造函数参数" ):

package SOD::KuuAnalyze::ProdId;
use Moose;

has 'users' => (
    isa => 'ArrayRef[Str]', is => "ro",
    init_arg => undef,    # do not allow in constructor
);
1;
Run Code Online (Sandbox Code Playgroud)

  • 如果使用MooseX :: StrictConstructor,如果将任何无效或不允许的参数传递给构造函数,模块构造将失败.我在几乎所有的Moose类中都使用它(对于其余的,我使用MooseX :: SlurpyConstructor来获取属性未使用的所有参数). (4认同)

fri*_*edo 5

怎么样

package SOD::KuuAnalyze::ProdId;

use Moose;

has 'users' => ( 
    isa => 'ArrayRef[Str]', 
    is => 'ro', 
    init_arg => undef, 
    default => sub { [ 'one', 'two' ] }, 
);
Run Code Online (Sandbox Code Playgroud)

设置init_argtoundef似乎是禁止从构造函数设置属性所必需的。