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