Size: a a a

2020 November 27

W

Warstone in Modern::Perl
Ну и можно еще потом через Deparse посмотреть код метода перед вызовом.
источник

W

Warstone in Modern::Perl
Просто вообще - должно работать так как вы ожидаете.
источник

c

crux in Modern::Perl
Warstone
Можно проверить если спросить ссылку на методы из Parent и из JSON::XS если ссылки одинаковые...
у Child и JSON::XS одинаковые. У Parent другая
источник

W

Warstone in Modern::Perl
Ну тогда все понятно
источник

W

Warstone in Modern::Perl
$self в методе Parent - это объект класса Child. И поэтому $self->method сначала будет искать method в Child, а не в Parent
источник

c

crux in Modern::Perl
Warstone
Ну тогда все понятно
Нет, понятно, почему вызывается экспортированная в чайлд саба в этой ситуации, непонятно, почему приоритет у неё, а не у той, которая в Parent
источник

W

Warstone in Modern::Perl
Потому что mro::get_linear_isa говорит что для ref $self сначала будет поиск в Child
источник

c

crux in Modern::Perl
всё, до меня дошло
источник

c

crux in Modern::Perl
спасибо )
источник

VG

Vadim Goncharov in Modern::Perl
новый вопрос для собеседований на сеньора :)
источник

W

Warstone in Modern::Perl
Ты сначала на миддла пройди. Хотя ты софт скиллз завалишь-же
источник

VG

Vadim Goncharov in Modern::Perl
ты уже их завалил только что
источник

c

crux in Modern::Perl
просто из-за того, что в XS экспортируется через @EXPORT - encode_json с таким use импортнулась в пространство имён чайлда и дальше понятно
источник

c

crux in Modern::Perl
норм
источник

W

Warstone in Modern::Perl
crux
просто из-за того, что в XS экспортируется через @EXPORT - encode_json с таким use импортнулась в пространство имён чайлда и дальше понятно
Для решения этой проблемы, кстати, есть namespace::clean
источник

W

Warstone in Modern::Perl
А, ну и https://metacpan.org/pod/namespace::clean::xs::all чтобы побыстрее
источник

c

crux in Modern::Perl
ага сенкс
источник

SZ

Sergey Zhmylove in Modern::Perl
crux
package Parent;

use strict;
use warnings;

use base 'Log::Dispatch::Output';
use JSON::XS qw();

sub log_by_filebeat {
   my ($self, $data) = @_;

   eval {
...
       # здесь пытается вызваться encode_json из JSON::XS
       $sock->syswrite($self->encode_json($data));
...
   };
}

sub encode_json {
...
}

1;

package Child;

use strict;
use warnings;
use JSON::XS;

use base 'Parent';

sub log_message {
   my $self = shift;

   $self->log_by_filebeat($body);

}

1;
Потому что в неймспейсе child есть явный метод из xs.
Self содержит объект блесснутый в child
источник

AT

Artem Tepponen in Modern::Perl
Прекрасный пример того, что ООП - это хрен просто так поймешь, что же вызывается )
источник

W

Warstone in Modern::Perl
Вообще довольно быстро нашли проблему.
источник