Tôi hiểu rằng việc sử dụng builder
cho phép các lớp con ghi đè dễ dàng thuộc tính mặc định và vai trò có thể require
chúng. Đây cũng có thể được thực hiện bằng default
như vậy:Moose "người xây dựng" và "mặc định"
has 'foo' =>
is => 'rw',
isa => 'Str',
default => sub { $_[0]->_build_foo };
Tôi tự hỏi nếu có những lợi thế hơn nữa để sử dụng builder
Tôi không biết? Tôi đã đưa ra một số bản thân mình:
builder
là khai báo để bạn có thể nội quan màfoo
được xây dựng bởi_build_foo
builder
loại bỏ một wrapper chương trình con làm cho nó nhanh hơn một chútbuilder
cho phép việc sử dụng các hữu íchlazy_build
.
CẬP NHẬT Để làm rõ, đây không phải là về default
vs builder
nói chung nhưng default => sub { $_[0]->_build_foo }
vs builder => '_build_foo'
.
Tại sao bạn nghĩ 'default => \ & builder' không làm mọi thứ trong số đó? – ikegami
@ikegami vì '\ & builder' sẽ được giải quyết thành' & builder' trong gói hiện tại. Một lớp con cung cấp một 'builder' mới sẽ phải làm' has '+ attr' => builder => \ & builder' một lần nữa để liên kết nó với phương thức ghi đè. OTOH 'builder => 'builder'' được giải quyết khi chạy. – hobbs
Là một điểm đối kháng, một phân lớp có thể ghi đè thuộc tính và thay đổi 'mặc định'. Điều này không đòi hỏi phải biết tên phương thức 'builder' có thể là private. * Cả hai * yêu cầu biết nếu thuộc tính đang sử dụng 'default' hoặc' builder' bởi vì bạn không thể có cả hai. Đây thường là thông tin cá nhân và có thể thay đổi. Việc ghi đè hành vi mặc định của thuộc tính trong Moose là có vấn đề, bạn phải xuất bản chi tiết về cách hành vi mặc định đó được triển khai hoặc lớp con phải nhìn vào. :/ – Schwern