Weź prostszy przykład
package Foo { sub new { die 7 } };
package Bar { sub new { die 42 } };
sub Foo { "Bar" }
Foo->new();
W powyższym przykładzie stała jest Footłumaczona na „Bar”, więc "Bar"->newnie wywołuje to "Foo"->new. Jak zatrzymać rozwiązywanie podprogramu? Możesz to zacytować.
"Foo"->new();
Jeśli chodzi o wpływ na wydajność, sytuacja nie ulegnie pogorszeniu, jeśli użyje się ciągu zamiast słowa. Potwierdziłem, że generowany optree O=Deparsejest taki sam. Zasadniczo wydaje się, że lepiej jest cytować Nazwy klas, jeśli ceni się poprawność.
Jest to wspomniane w Programowaniu w Perlu (niestety w kontekście pośredniego wywołania metody )
... więc powiemy ci, że prawie zawsze możesz uciec od nagiej nazwy klasy, pod warunkiem, że dwie rzeczy są prawdziwe. Po pierwsze, nie ma podprogramu o takiej samej nazwie jak klasa. (Jeśli postępujesz zgodnie z konwencją, że nazwy podprogramów, takie jak newrozpoczynaj małe litery, i nazwy klas, takie jak ElvenRingrozpoczynaj wielkie litery , nigdy nie stanowi to problemu). Po drugie, klasa została załadowana jednym z
use ElvenRing;
require ElvenRing;
Każda z tych deklaracji zapewnia, że Perl wie, że ElvenRingjest nazwą modułu, co zmusza każdą nagą nazwę, taką jak newprzed nazwą klasy, ElvenRingdo interpretacji jako wywołanie metody, nawet jeśli zdarzy się, że zadeklarujesz własny newpodprogram w bieżącym pakiecie.
I to ma sens: zamieszanie może się zdarzyć tylko wtedy, gdy twoje podprogramy (zwykle małe litery) mają takie same nazwy jak klasa (zwykle wielkie litery). Może się to zdarzyć tylko w przypadku naruszenia powyższej konwencji nazewnictwa.
tldr; prawdopodobnie dobrze jest zacytować swoje nazwy klas, jeśli je znasz i cenisz poprawność nad bałaganem.
Uwaga dodatkowa: alternatywnie możesz przerwać rozwiązywanie słowa-słowa w funkcji poprzez umieszczenie a ::na jego końcu, na przykład powyżej Foo::->new.
Dziękuję Ginnzowi na reddit za zwrócenie mi na to uwagi i Toby'emu Inksterowi za komentarz (chociaż nie miało to dla mnie sensu przy pierwszym czytaniu).
Foo::->new, jak dowiedziałem się od ikegami.