Атрибут Moose ArrayRef возвращается как массив

У меня есть класс Moose с атрибутом, который является ArrayRef (только для чтения) и управляется внутри объекта. Но когда кто-то вызывает метод доступа, я хочу, чтобы он возвращал массив (или список), а не ссылку. Это не только сократит количество разыменований, которые должен выполнять пользователь класса, но и будет означать, что они не смогут случайно изменить ту же самую ссылку, которую использует мой объект.

Итак, как лучше всего это сделать? Какое-то принуждение?


person mpeters    schedule 07.12.2009    source источник


Ответы (3)


Используйте Moose::Meta::Attribute:: Native::Trait::Array и делегирование, например

handles => { my_array => 'elements' }

(через Дой на #лося)

auto_deref имеет нежелательное поведение, возвращая ссылку, если вы вызываете метод доступа в скалярном контексте.

person hdp    schedule 07.12.2009
comment
Документы для auto_deref (в Moose git) теперь проясняют это. - person hdp; 07.12.2009

Хотя вы можете использовать auto-deref, Moose::Manual::BestPractices говорит, что это не лучший способ сделать это, и что вместо этого вам следует рассмотреть возможность использования Moose::Meta::Attribute::Native для выполнения этой функции.

person Adam Bellaire    schedule 07.12.2009

Используйте параметр auto_deref:

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

Обратите внимание, что иногда вы не получите массив обратно при использовании метода чтения, в зависимости от скалярного или спискового контекста выражения. Некоторое время назад я столкнулся с ситуацией, когда мне пришлось явно указать контекст массива в выражении, чтобы заставить работать разыменование. Я добавлю пример, если смогу его найти.

person Ether    schedule 07.12.2009
comment
Спасибо, я просмотрел документы, но, видимо, что-то столь очевидное просто пропущено моими глазами :) - person mpeters; 07.12.2009