我有一个 Moose 类,其属性是 ArrayRef(只读),并由对象在内部进行操作。但是当有人调用访问器方法时,我希望它返回一个数组(或列表)而不是引用。这不仅会减少类用户必须执行的取消引用的数量,而且意味着他们不会意外篡改我的对象正在使用的同一个 ref。
那么最好的方法是什么?某种胁迫?
使用Moose::Meta::Attribute::Native::Trait::Array和委托,例如
handles => { my_array => 'elements' }
(通过#moose上的doy)
auto_deref如果您在标量上下文中调用访问器,则仍然返回引用的不良行为。
虽然您可以使用auto-deref,但Moose::Manual::BestPractices表示这不是最好的方法,您应该考虑使用Moose::Meta::Attribute::Native来完成该功能。
使用auto_deref选项:
has my_field => (
is => 'ro', isa => 'ArrayRef[Str]',
auto_deref => 1,
# rest of options...
);
请注意,有时在使用 reader 方法时不会返回数组,具体取决于表达式的标量或列表上下文。不久前,我遇到了一种情况,我必须将数组上下文显式地引入表达式才能使取消引用起作用。如果我能找到它,我将添加一个示例。