Moo, ленивые атрибуты и вызов по умолчанию / принудительный вызов - PullRequest
3 голосов
/ 17 марта 2012

Мой класс на основе Moo имеет атрибуты lazy и non-lazy, которые имеют как default, так и coerce sub. Если я не инициализирую атрибуты, я обнаруживаю, что оба подпрограммы default и coerce вызываются для нормального атрибута, но только для default вызывается для ленивого атрибута. Это кажется противоречивым. Вот пример кода:

package Foo;
use Moo;

has nrml => ( is => 'ro',
              default => sub { print "nrml default\n" },
              coerce  => sub { print "nrml coerce\n" } 
            );

has lazy => ( is => 'ro',
              lazy => 1,
              default => sub { print "lazy default\n" },
              coerce  => sub { print "lazy coerce\n" }
            );



my $q = Foo->new( );

$q->lazy;

Вывод:

nrml default
nrml coerce
lazy default

Я ожидаю, что coerce запустится, только если я предоставлю значение в конструкторе. Что еще более важно, я ожидаю одинаковую последовательность выполнения (default или default и coerce) как для ленивых, так и для обычных атрибутов.

Итак, мои ожидания не верны, это ошибка или что? Спасибо!

Ответы [ 2 ]

6 голосов
/ 18 марта 2012

Текущий статус: исправление отправлено в 009014

Один из этих двух - ошибка.

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

... на самом деле, проблема в том, что Method :: Generate :: Accessor при запуске _use_default всегда оборачивает его в _generate_simple_set, когда _generate_set обеспечивает обертывание триггера isa + coerce + - и я вполне уверен, что Moose запускает все три, когда применяет значение по умолчанию, поэтому нам тоже нужно.

Это не совсем тривиальное исправление, потому что я не параметризовал _generate_set для получения значения, указывающего, как генерировать значение для установки. Я попробую разобраться завтра, так как я планирую выпустить релиз.

Если вам нужна поддержка Moo от разработчиков, пожалуйста, свяжитесь с bugs-Moo@rt.cpan.org или присоединитесь к # web-simple на irc.perl.org - это просто удача, что кто-то на канале IRC увидел этот вопрос и спросил об этом :)

3 голосов
/ 17 марта 2012

Это было бы для меня ошибкой.Либо значение из default должно быть правильного типа, либо это не так.Иметь и оправдывать ожидания только половину времени не имеет смысла.

...