tôi đã không thể tìm ra một cách để làm Moose thuộc tính hoàn toàn riêng tư. Bất cứ khi nào tôi sử dụng has 'name' => (...);
để tạo thuộc tính, nó luôn luôn được tiếp xúc với việc đọc ở mức tối thiểu. Đối với các mục tôi muốn thực sự riêng tư, tôi đang sử dụng các biến "my" chuẩn bên trong gói Moose. Để có ví dụ nhanh, hãy lấy mô-đun sau "CountingObject.pm".
package CountingObject;
use Moose;
my $cntr = 0;
sub add_one { $cntr++; }
sub get_count { return $cntr; }
1;
Các tập lệnh sử dụng mô-đun đó không có quyền truy cập trực tiếp vào biến $ cntr. Họ phải sử dụng các phương thức "add_one" và "get_count" hoạt động như một giao diện cho thế giới bên ngoài. Ví dụ:
#!/usr/bin/perl
### Call and create
use CountingObject;
my $co = CountingObject->new();
### This works: prints 0
printf("%s\n", $co->get_count());
### This works to update $cntr through the method
for (1..10) { $co->add_one(); }
### This works: prints 10
printf("%s\n", $co->get_count());
### Direct access won't work. These would fail:
# say $cntr;
# say $co->cntr;
Tôi mới đến Moose, nhưng như xa như tôi có thể nói, phương pháp này cung cấp biến hoàn toàn riêng tư.
Nguồn
2012-01-28 06:02:03
Câu hỏi hỏi về đọc cũng như viết. Theo như tôi có thể nói, trong phiên bản tháng 1 năm 2012 của Moose (2.0401), các thuộc tính được tạo theo cách này vẫn có thể đọc được từ bên ngoài đối tượng. Ví dụ: 'my $ m = MooseObject-> new(); in $ m -> _ genetic_code; 'sẽ in bất cứ thứ gì được lưu trong thuộc tính. Tôi không biết nếu có một cách xung quanh đó. Nó không bao giờ làm phiền tôi, nhưng tôi thấy nó đáng nói đến. –
@ AlanW.Smith Sẽ thay đổi 'is => 'ro'' thành' is =>' bare'' help? Trong trường hợp đó, cách duy nhất để truy cập '_genetic_code' từ bên ngoài sẽ là nhìn trộm dưới chính Moose và nhìn vào đối tượng băm hoặc một cái gì đó, vì Moose cũng sẽ không tạo ra bộ đọc truy cập. Đúng không? – sundar