Візьмемо простіший приклад
package Foo { sub new { die 7 } };
package Bar { sub new { die 42 } };
sub Foo { "Bar" }
Foo->new();
У наведеному вище прикладі константа Foo
вирішує значення "Bar", тому це "Bar"->new
не викликає "Foo"->new
. Як зупинити розв'язання підпрограми? Ви можете це процитувати.
"Foo"->new();
Що стосується наслідків для продуктивності, то ситуація не погіршується, використовуючи рядок, а не барево. Я підтвердив, що optree, створена компанією O=Deparse
, однакова. Тому, як правило, здається, що краще цитувати назви класів, якщо ви цінуєте правильність.
Про це йдеться в програмуванні Perl (на жаль в контексті непрямого виклику методу )
... тож ми скажемо вам, що майже завжди можна піти з голою назвою класу, якщо дві речі справжні. По-перше, немає підпрограми з тим самим іменем, що і клас. (Якщо ви дотримуєтесь конвенції, що назви підпрограми, такі як new
запускати малі регістри та імена класів, як ElvenRing
початкові великі регістри , це ніколи не є проблемою). По-друге, клас завантажений одним із
use ElvenRing;
require ElvenRing;
Будь-яка з цих декларацій гарантує, що Perl знає ElvenRing
, це ім'я модуля, яке змушує будь-яке оголене ім’я, як і new
раніше, назву класу ElvenRing
інтерпретувати як виклик методу, навіть якщо ви, можливо, оголосили власну new
підпрограму в поточному пакеті.
І це має сенс: плутанина тут може статися лише в тому випадку, якщо ваші підпрограми (як правило, малі регістри) мають те саме ім’я, що і клас (як правило, великі регістри). Це може статися лише в тому випадку, якщо ви порушите цю угоду про іменування вище.
tldr; це, мабуть, хороша ідея, щоб процитувати свої назви класів, якщо ви їх знаєте, і ви цінуєте коректність над безладом.
Побічна примітка: або ви можете зупинити розв’язання барева до функції, прикріпивши а ::
до кінця її, наприклад, вище Foo::->new
.
Дякую Ginnz на Reddit за те, що він мені це вказав , і Тобі Інкстер за коментар (хоча це не мало сенсу для мене в першому читанні).
Foo::->new
, як я дізнався з ікегамі.