Car->Race()
- это то же самое, что и
Car->can('Race')->('Car');
^^^^^^^^^^^^^^^^ ^^^^^
sub ref args
. Как видите, аргумент передается в подпрограмму.Если вы не хотите использовать anon sub, вам придется проинструктировать Tk передать этот аргумент.У Tk есть способ сделать это.
-command => [ Car->can('Race'), 'Car' ],
Это может быть или не быть немного быстрее, но это определенно не так ясно, как
-command => sub { Car->Race() },
Что касается подпрограмм в других пакетах?Если у вас есть что-то, что вызывается с помощью
Car::Race();
, это будет вызываться с использованием
-command => \&Car::Race,
Но это не то, что у вас есть здесь.
* - за исключением модулей, использующихAUTOLOAD
.Вот почему автозагрузчики должны переопределять can
.