8

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

那么最好的方法是什么?某种胁迫?

4

3 回答 3

18

使用Moose::Meta::Attribute::Native::Trait::Array和委托,例如

handles => { my_array => 'elements' }

(通过#moose上的doy)

auto_deref如果您在标量上下文中调用访问器,则仍然返回引用的不良行为。

于 2009-12-07T18:31:54.517 回答
6

虽然您可以使用auto-deref,但Moose::Manual::BestPractices表示这不是最好的方法,您应该考虑使用Moose::Meta::Attribute::Native来完成该功能。

于 2009-12-07T18:32:44.827 回答
3

使用auto_deref选项:

has my_field => (
    is => 'ro', isa => 'ArrayRef[Str]',
    auto_deref => 1,
    # rest of options...
);

请注意,有时在使用 reader 方法时不会返回数组,具体取决于表达式的标量或列表上下文。不久前,我遇到了一种情况,我必须将数组上下文显式地引入表达式才能使取消引用起作用。如果我能找到它,我将添加一个示例。

于 2009-12-07T18:28:45.670 回答