Я понимаю, что использование builder
позволяет подклассам легко переопределять атрибуты по умолчанию, а роли могут быть require
. Это также может быть достигнуто с помощью default
так:Moose «builder» vs «default»
has 'foo' =>
is => 'rw',
isa => 'Str',
default => sub { $_[0]->_build_foo };
мне интересно, если есть дополнительные преимущества для использования builder
я не знаю? Я пришел с каким-то себе:
builder
декларативно, так что вы можете самоанализом, чтоfoo
построен_build_foo
builder
устраняет подпрограмму оболочки, что делает его немного быстрееbuilder
позволяет использование полезныйlazy_build
.
UPDATE Чтобы уточнить, это не про default
против builder
в целом, но default => sub { $_[0]->_build_foo }
против builder => '_build_foo'
.
Почему вы думаете, что 'default => \ & builder' не выполняет каждую из этих вещей? – ikegami
@ikegami, потому что '' & builder' будет разрешен для '& builder' в текущем пакете. Подкласс, который предоставляет новый 'builder', должен был бы снова использовать' has '+ attr' => builder => \ & builder', чтобы привязать его к переопределенному методу. OTOH 'builder => 'builder'' разрешен во время выполнения. – hobbs
В качестве контрапункта подкласс может переопределить атрибут и изменить «default». Это не требует знания имени метода private builder. * Оба * требуют знать, использует ли атрибут 'default' или' builder', потому что вы не можете иметь оба. Это, как правило, частная информация и может быть изменена. Переопределение поведения атрибутов в Moose по умолчанию является проблематичным, вам нужно публиковать сведения о том, как это поведение по умолчанию реализовано, или подкласс должен инспектировать. :/ – Schwern