[Kiev-pm] [Moscow.pm] Работа со слабыми (weaken) ссылками в Perl
Ilya Chesnokov
chesnokov.ilya at gmail.com
Tue May 2 03:29:37 PDT 2017
2 мая 2017 г., 13:13 пользователь Коваль Вячеслав via Moscow-pm
<moscow-pm at pm.org> написал:
> Здравствуйте!
> Имеется такой код
>
> #!/usr/bin/env perl
> use strict;
> use warnings;
>
> use DDP;
> use Scalar::Util qw/weaken/;
>
> my $struct = {abc => [qw/1 2 3/]};
> sub set_data {
> my $node = shift;
> my $ref = [ $node ];
> weaken($ref->[0]);
> return $ref
> }
> my $arr_ref = set_data($struct);
> p $arr_ref;
> p $struct;
> weaken $struct;
> say '-' x 20;
> p $arr_ref;
> p $struct;
>
> вывод:
>
> \ [
> [0] {
> abc [
> [0] 1,
> [1] 2,
> [2] 3
> ]
> } (weak)
> ]
> \ {
> abc [
> [0] 1,
> [1] 2,
> [2] 3
> ]
> }
> --------------------
> \ [
> [0] undef
> ]
> undef
>
> Не пойму, почему после weaken $struct обнуляется/удаляется структура
> $struct, ну и соответственно удаляется ссылка в $arr_ref
Потому что все ссылки на хеш, хранившийся у вас ранее в $struct -
слабые. Нет ни одной "сильной" ссылки, в результате чего ссылка
превращается в undef.
> Вариант с блоком кода в документации понятен
>
> {
> my $var;
> $ref = \$var;
> weaken($ref); # Make $ref a weak reference
> }
> # $ref is now undef
>
> или в однострочнике:
>
> $ perl -MScalar::Util=weaken -MDDP -E 'my $ref; { my $var = 5; $ref =
> \$var; weaken($ref); }; p $ref'
> undef
>
> когда мы делаем ссылку слабой и по выходу из блока ссылка уничтожается ()
>
> а вот вариант, когда мы еще раз вызываем weaken на структуре, в результате
> она уничтожается не до конца понятен
Там до блока кода есть еще несколько слов о том, как это вообще все работает :)
... weak reference. This means that it
will not hold a reference count on the object it references. Also, when
the reference count on that object reaches zero, the reference will be set
to undef...
> --
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org
>
--
Best regards,
Ilya Chesnokov
More information about the Kiev-pm
mailing list