Próbuję napisać rolę singleton za pomocą Perl i Moose. Rozumiem, że moduł MooseX :: Singleton jest dostępny, ale zawsze jest wymagany opór, gdy wymagany jest inny moduł CPAN dla naszego projektu. Po wypróbowaniu tego i kłopotach chciałbym zrozumieć, DLACZEGO moja metoda nie działa. Rola Singleton Pisałem jest następujący:Role Singleton w 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;
To wydaje się działać znaleźć, gdy tylko jedna klasa używa singleton rolę. Jednakże, gdy dwie klasy (na przykład ClassA i ClassB) obaj przyjmują rolę Singleton, wydaje się, że odnoszą się one do wspólnej zmiennej $ _singleInstance. Jeśli wywołasz ClassA-> getInstance, zwróci referencję do obiektu ClassA. Jeśli wywołaję ClassB-> getInstance później w tym samym skrypcie, zwróci to odwołanie do obiektu typu ClassA (mimo że wyraźnie nazwałem metodę getInstance dla ClassB). Jeśli nie użyję roli, a właściwie skopiuję i wkleję kod z roli Singleton do ClassA i ClassB, to wygląda na to, że działa dobrze. Co tu się dzieje?
Zdajesz sobie sprawę, że zawijanie słowa "nowy" jest po prostu pytaniem o świat bólu, prawda? – Ether