Возьмите более простой пример
package Foo { sub new { die 7 } };
package Bar { sub new { die 42 } };
sub Foo { "Bar" }
Foo->new();
В приведенном выше примере константа Fooпреобразуется в «Бар», так что это "Bar"->newне вызывает "Foo"->new. Как вы мешаете разрешению подпрограммы? Вы можете процитировать это.
"Foo"->new();
Что касается влияния на производительность, все не становится хуже, если использовать строку, а не голое слово. Я подтвердил, что сгенерированный optree O=Deparseтакой же. Так что, как правило, кажется, что лучше указывать имена классов, если вы цените правильность.
Это упоминается в программировании на Perl (к сожалению, в контексте косвенного вызова метода )
... так что мы скажем вам, что вы почти всегда можете обойтись без имени класса при условии, что две вещи верны. Во-первых, нет подпрограммы с тем же именем, что и у класса. (Если вы следуете соглашению, что имена подпрограмм, такие как newстартовые строчные буквы, и имена классов, такие как ElvenRingстартовые прописные , это никогда не будет проблемой). Во-вторых, класс был загружен одним из
use ElvenRing;
require ElvenRing;
Любое из этих объявлений гарантирует, что Perl знает, ElvenRingчто это имя модуля, что заставляет любое голое имя, как newперед именем класса ElvenRing, интерпретироваться как вызов метода, даже если вам случится объявить собственную newподпрограмму в текущем пакете.
И это имеет смысл: путаница здесь может произойти, только если ваши подпрограммы (обычно строчные) имеют то же имя, что и класс (обычно прописные). Это может произойти только в том случае, если вы нарушите вышеуказанное соглашение об именах.
tldr; Вероятно, это хорошая идея - указывать свои имена классов, если вы их знаете и цените правильность, а не беспорядок.
Примечание: в качестве альтернативы вы можете остановить преобразование голого слова в функцию, добавив к его концу символ a ::, например, как описано выше Foo::->new.
Спасибо Ginnz на Reddit за указание на это мне , и Тоби Инкстер за комментарий (хотя это не имело смысла для меня при первом прочтении).
Foo::->new, как я узнал от икегами.