Атрибут Moose ArrayRef возвращен как массив - PullRequest
8 голосов
/ 07 декабря 2009

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

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

Ответы [ 3 ]

17 голосов
/ 07 декабря 2009

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

handles => { my_array => 'elements' }

(через Дой на #moose)

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

6 голосов
/ 07 декабря 2009

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

3 голосов
/ 07 декабря 2009

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

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

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

...