Если вы спрашиваете, что я думаю, вы спрашиваете, вы, вероятно, должны пройти закрытие:
sub method_of_class_A {
my $self = shift;
return B->new(
back => sub { $self->a_specific_method_of_class_A(); }
)->run;
}
и я думаю, что это то, что вам нужно, потому что вы, кажется, не передаете экземплярот $a
до B.
Если вам это нужно много, вы можете назначить его как поле в объекте:
back => $self->{invoke_method_closure}
||= sub { $self->a_specific_method_of_class_A(); }
Я не совсем уверен, как любой из этихИдея помогает с критериями «что стек не накапливается», потому что я не совсем уверен, что влечет за собой этот критерий.Вызов goto
просто не добавит уровень 1 в стек.Однако, если вы посмотрите на этот блок, вы увидите, что вы собираетесь.И вы перейдете к инструкции, чтобы вызвать метод обычным способом.Так что тот уровень, который вы «сохранили», используется в любом случае.
goto
s лучше не пытаться преждевременно оптимизировать вызов метода, а передавать стек другому обработчику с некоторым поведением переноса.Таким образом, он работает достаточно хорошо в методах import
, которые делегируют базовое поведение Exporter
, или в подпрограммах AUTOLOAD
, которые пытаются выяснить, что хочет делать вызывающий объект, а затем вызывают соответствующий код с переданными аргументами.