Я пытаюсь написать одиночную роль, используя Perl и Moose. Я понимаю, что модуль MooseX :: Singleton доступен, но всегда есть сопротивление, когда требуется другой модуль CPAN для нашего проекта. Попробовав это и испытав небольшие проблемы, я бы хотел понять, ПОЧЕМУ мой метод не работает. Роль синглтона, которую я написал, выглядит следующим образом:
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;
Это похоже на работу find, когда только один класс использует роль синглтона. Однако, когда два класса (например, ClassA и ClassB) используют роль Singleton, это появляется, поскольку они оба ссылаются на общую переменную $ _singleInstance. Если я вызываю ClassA-> getInstance, он возвращает ссылку на объект ClassA. Если я позже вызываю ClassB-> getInstance в том же сценарии, он возвращает ссылку на объект типа ClassA (хотя я явно вызывал метод getInstance для ClassB). Если я не использую роль и на самом деле копирую и вставляю код из роли Singleton в ClassA и ClassB, он, кажется, работает нормально. Что здесь происходит?