2009-02-18 4 views
7

Moose::Manual::Attributes состояние:Почему построитель Moose берет строковое значение?

В качестве альтернативы использования ссылки на подпрограмму [по умолчанию], вы можете вместо этого поставить метод строителя для атрибута: ... Это имеет несколько преимуществ. Во-первых, он перемещает кусок кода в свой собственный именованный метод, что улучшает читаемость и организацию кода.

Таким образом, ваш атрибут может определить значение по умолчанию таким образом:

has attr => (
    is => 'ro', 
    builder => 'subroutine' 
); 
sub subroutine { 
    # figure out and return default value 
} 

Я не понимаю, почему это должно быть отделено от дефолта. Не могли бы вы просто передать ссылку на именованную подпрограмму?

has attr => (
    is => 'ro', 
    default => \&subroutine 
); 

И хотел бы, чтобы не быть лучше практикой программирования, поскольку вы гарантированно не случайно относятся к подпрограмме, которая не существует? Вы ссылаетесь на метод с логической ссылкой вместо символической ссылки.

ответ

14

Когда строитель называется, это происходит:

$object->$builder 

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

Если это ссылка на подпрограмму, ссылка берется в пакете исходного класса, что означает, что ее нельзя переоценить одинаково.

10

Это не «символическая» ссылка. Строителем является метод имя. Это означает, что он наследуется и может быть скомплектован из роли. Если вы передадите ссылку подпрограммы, эта ссылка должна существовать в одном пакете (или быть полностью квалифицированным).

Я уверен, что объясню это в руководстве. Это непонятно?

+0

Ну, я знаю, что это не ссылка в смысле Perl; Я просто подумал, что лучше программировать - это передать реальную ссылку на именованную подпрограмму по причинам, о которых я упоминал. Однако вы правы; остальная часть руководства действительно показывает, почему так, как это желательно ... – skiphoppy

+1

Обратите внимание на абзац, который начинается «Это имеет несколько преимуществ. Первое ...»; возможно, это помогло бы переместить часть следующего раздела там, чтобы следить за тем, чтобы пункт дал больше, чем просто одно преимущество, немного раньше для тех, кто интересуется. – skiphoppy

7

Подкласс.

Builder определяет имя методы для вызова, так

package Something; 
use Moose; 

extends 'YourClass'; 

sub subroutine { <some other default> } 

будет иметь что-то :: подпрограммы с именем для строителя «подпрограммы», в то время как если бы вы использовали стиль subref то YourClass :: подпрограмма будет вместо этого, потому что вы сделали прямую ссылку на подпрограмму, а не позволяете ей проходить процедуру отправки.