如何在设置前处理 Moose 属性 setter 中的参数?
How to process the argument in a Moose attribute setter before setting?
我的 Moose 对象有一个属性,它是一个字符串数组引用。我想通过仅传递单个字符串 ('string'
) 而不是单个字符串 (['string']
).
的 arrayref 来将其设置为单元素列表
has 'my_list' => (
is => 'rw',
isa => 'ArrayRef[Str]',
);
解决这个问题的正确方法是什么?通过 trigger
?
我还不确定我是在对象构造函数和属性中都需要它 setter,还是只在构造函数中需要它。
解决此问题的最佳方法是使用 type coercion(从另一种创建一种类型)。
请注意,强制转换为标准的 Moose 类型是个坏主意,因此我们还创建了一个子类型。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
package MyClass;
use Moose;
use Moose::Util::TypeConstraints; # defines 'subtype' and 'coerce'
# Our new subtype
subtype 'ArrayRefofStr',
as 'ArrayRef[Str]';
# Define the coercion from a string to
# and array of strings
coerce 'ArrayRefofStr',
from 'Str',
via { [ $_ ] };
has 'my_list' => (
is => 'rw',
isa => 'ArrayRefofStr', # Change to subtype
coerce => 1, # Turn on type coercion
);
package main;
my $obj1 = MyClass->new(my_list => ['foo']);
my $obj2 = MyClass->new(my_list => 'bar' );
say $obj1->my_list->[0];
say $obj2->my_list->[0];
我的 Moose 对象有一个属性,它是一个字符串数组引用。我想通过仅传递单个字符串 ('string'
) 而不是单个字符串 (['string']
).
has 'my_list' => (
is => 'rw',
isa => 'ArrayRef[Str]',
);
解决这个问题的正确方法是什么?通过 trigger
?
我还不确定我是在对象构造函数和属性中都需要它 setter,还是只在构造函数中需要它。
解决此问题的最佳方法是使用 type coercion(从另一种创建一种类型)。
请注意,强制转换为标准的 Moose 类型是个坏主意,因此我们还创建了一个子类型。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
package MyClass;
use Moose;
use Moose::Util::TypeConstraints; # defines 'subtype' and 'coerce'
# Our new subtype
subtype 'ArrayRefofStr',
as 'ArrayRef[Str]';
# Define the coercion from a string to
# and array of strings
coerce 'ArrayRefofStr',
from 'Str',
via { [ $_ ] };
has 'my_list' => (
is => 'rw',
isa => 'ArrayRefofStr', # Change to subtype
coerce => 1, # Turn on type coercion
);
package main;
my $obj1 = MyClass->new(my_list => ['foo']);
my $obj2 = MyClass->new(my_list => 'bar' );
say $obj1->my_list->[0];
say $obj2->my_list->[0];