如何在设置前处理 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];