Tôi đang cố viết một vai trò đơn lẻ bằng Perl và Moose. Tôi hiểu một mô-đun MooseX :: Singleton có sẵn nhưng luôn luôn có sức đề kháng khi yêu cầu một mô-đun CPAN khác cho dự án của chúng tôi. Sau khi thử điều này và có một chút rắc rối tôi muốn hiểu TẠI SAO phương pháp của tôi không hoạt động. Vai trò đơn tôi đã viết như sau:Các vai trò Singleton trong Moose
package Singleton;
use Moose::Role;
my $_singleInstance;
around 'new' => sub {
my $orig = shift;
my $class = shift;
if (not defined $_singleInstance){
$_singleInstance = $class->$orig(@_);
}
return $_singleInstance;
};
sub getInstance
{
return __PACKAGE__->new();
}
1;
Điều này dường như chỉ hoạt động khi chỉ có một lớp sử dụng vai trò đơn. Tuy nhiên khi hai lớp (ClassA và ClassB ví dụ) cả hai tiêu thụ vai trò Singleton nó xuất hiện khi cả hai đều đề cập đến một biến $ _singleInstance chia sẻ. Nếu tôi gọi ClassA-> getInstance nó sẽ trả về một tham chiếu đến một đối tượng ClassA. Nếu tôi gọi ClassB-> getInstance đôi khi trong cùng một kịch bản nó trả về một tham chiếu đến một đối tượng kiểu ClassA (mặc dù tôi đã gọi rõ ràng phương thức getInstance cho ClassB). Nếu tôi không sử dụng một vai trò và thực sự sao chép và dán mã từ vai trò Singleton vào ClassA và ClassB nó xuất hiện để làm việc tốt. Những gì đang xảy ra ở đây?
Bạn nhận ra rằng gói 'mới' chỉ yêu cầu một thế giới bị tổn thương, phải không? – Ether