Как я могу передать метод экземпляра в Perl? - PullRequest
1 голос
/ 25 июля 2011
sub method_of_class_A {
    B->new(back => a_specific_method_of_class_A)->run;
}

Я хочу передать текущий A экземпляр a a_specific_method_of_class_A в B экземпляр b, чтобы b смог goto a * a_specific_method_of_class_A

как будто a->a_specific_method_of_class_A вызывается напрямую, чтобы стек не накапливался.

Как делать такую ​​работу в Perl?

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

Используйте метод can.

1 голос
/ 25 июля 2011

Если вы спрашиваете, что я думаю, вы спрашиваете, вы, вероятно, должны пройти закрытие:

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, которые пытаются выяснить, что хочет делать вызывающий объект, а затем вызывают соответствующий код с переданными аргументами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...