2009-12-07 7 views
8

Tôi có một lớp Moose với một thuộc tính là một ArrayRef (chỉ đọc) và được thao tác bên trong bởi đối tượng. Nhưng khi ai đó gọi phương thức accessor tôi muốn nó trả về một mảng (hoặc danh sách) không phải là một tham chiếu. Điều này không chỉ cắt giảm số lượng dereferencing mà người dùng của lớp phải làm, nhưng nó sẽ có nghĩa là họ không thể vô tình giả mạo với cùng một ref mà đối tượng của tôi đang sử dụng.Thuộc tính Moose ArrayRef được trả về dưới dạng Array

Vậy cách tốt nhất để làm điều này là gì? Một số loại cưỡng chế?

Trả lời

17

Sử dụng Moose::Meta::Attribute::Native::Trait::Array và ủy quyền, ví dụ:

handles => { my_array => 'elements' } 

(qua doy trên #moose)

auto_deref có hành vi không mong muốn của vẫn trả về một tài liệu tham khảo nếu bạn gọi accessor trong bối cảnh vô hướng.

+2

Tài liệu cho 'auto_deref' (trong Moose git) hiện rõ hơn. – hdp

3

Sử dụng auto_deref tùy chọn:

has my_field => (
    is => 'ro', isa => 'ArrayRef[Str]', 
    auto_deref => 1, 
    # rest of options... 
); 

Lưu ý rằng đôi khi bạn sẽ không nhận được một mảng trở lại khi sử dụng phương pháp đọc, tùy thuộc vào vô hướng hoặc danh sách bối cảnh của biểu thức. Một thời gian trước, tôi chạy vào một tình huống mà tôi đã phải đưa rõ ràng bối cảnh mảng vào biểu thức để có được dereferencing để làm việc .. Tôi sẽ thêm một ví dụ nếu tôi có thể tìm thấy nó.

+1

Cảm ơn, tôi đã xem qua các tài liệu, nhưng dường như điều gì đó hiển nhiên này đã bị bỏ qua bởi đôi mắt của tôi :) – mpeters