Я думаю, что это проблема инкапсуляции. Если сторонняя библиотека использует слабые ссылки внутри, мой код не должен заранее знать, что когда я делаю копию ссылки, она может внезапно исчезнуть у меня. Обычное ожидание в Perl состоит в том, что ссылка останется действительной до тех пор, пока она существует. Когда вы звоните по номеру weaken
, вы в основном обещали, что перед тем, как использовать его, вы предпримете необходимые шаги, чтобы проверить, что ссылка все еще действительна.
В качестве второй причины интерфейс для ослабления сильной копии слабой ссылки довольно прост.
my $new_ref = $old_ref; if (isweak($old_ref)) { weaken($new_ref); }
Код, который делает то же самое, чтобы получить сильный реф, если слабый реф создал слабый реф, немного сложнее.
my $new_ref;
if (ref($old_ref) eq 'ARRAY') {
$new_ref = \@{$old_ref};
}
elsif (ref($old_ref) eq 'HASH') {
$new_ref = \%{$old_ref};
}
elsif (.....
Если вы знаете, что ссылка может быть только одного типа, вы можете сохранить каскад if
/ elsif
и просто выполнить deref-reref, но еще сложнее судить, почему вы разыменовались, просто чтобы взять новую ссылку. Следующий сопровождающий попытается «исправить» ваш код.