Moose ArrayRef属性作为Array返回

时间:2009-12-07 18:04:00

标签: perl oop moose

我有一个Moose类,其属性是一个ArrayRef(只读),并由对象内部操作。但是当有人调用访问器方法时,我希望它返回一个数组(或列表)而不是引用。这不仅会减少类的用户必须执行的解除引用量,而且还意味着它们不会意外地篡改我的对象使用的相同引用。

那么最好的方法是什么?某种强制?

3 个答案:

答案 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方法时不会返回数组,具体取决于表达式的标量或列表上下文。前一段时间我遇到了一种情况,我必须明确地将数组上下文带到表达式才能使解除引用工作..如果我能找到它,我会添加一个例子。