Как вы карри встроенную функцию для логического типа (и установите его в 1 или 0)? - PullRequest
0 голосов
/ 19 октября 2011

Я думал, что мог бы вывести булевский нативный тип на true или false при вызове функции, но, похоже, не работает так, как я ожидал

дополнено чертами

    has 'Lock'    => ( 
        is => 'ro', 
        isa => 'Bool', 
        traits => ['Bool'],
        default => 0 ,
        reader  => 'isLocked', 
        handles => {
            lock     => [ set => 1 ],
            unlock => [ set => 0 ],
            flip     => 'toggle',

        }
  ); 

1 Ответ

6 голосов
/ 19 октября 2011

Я думаю, что вы ищете здесь Moose :: Meta :: Attribute :: Native :: Trait :: Bool , указанный traits => ['Bool'].

Когда у вас есть isa => 'Bool', default => 0, ваш атрибут не содержит объект. Вы не можете вызывать методы с номером 0, поэтому он не может handles ничего без помощи нативной черты.

From Moose :: Meta :: Attribute :: Native : «Собственные делегирования позволяют делегировать собственные структуры данных Perl, как если бы они были объектами». Это означает, что когда вы используете handles с ними, они генерируют специальные методы, которые выполняют определенные операции с атрибутом, кроме вызова метода для объекта, хранящегося в атрибуте. Родная черта Bool предоставляет методы set, unset и toggle, что означает, что вы можете делать то, что хотите, с помощью:

has 'Lock'    => ( 
    is => 'ro', 
    isa => 'Bool',
    traits => ['Bool'],
    default => 0 ,
    reader  => 'isLocked', 
    handles => {
        lock     => 'set',
        unlock   => 'unset',
        flip     => 'toggle',
    }
 );
...