Myślę, że to problem z hermetyzacją. Jeśli biblioteka osób trzecich używa słabych informacji wewnętrznych, nie należy oczekiwać, że mój kod będzie wiedział z wyprzedzeniem, że gdy wykonam kopię odwołania, może nagle zniknąć. W Perlu zwykle oczekuje się, że ref będzie ważny tak długo, jak długo istnieje. Kiedy zadzwonisz pod numer weaken
, zasadniczo obiecałeś, że podejmiesz niezbędne kroki, aby sprawdzić, czy referencja jest nadal ważna, zanim go użyjesz.
Jako drugi powód, dla którego interfejs osłabiający silną kopię słabego ref jest dość cieśninowy.
Kod, aby zrobić to samo, aby uzyskać silny ref, jeśli słaby ref stworzył słaby ref jest nieco bardziej skomplikowany.
my $new_ref;
if (ref($old_ref) eq 'ARRAY') {
$new_ref = \@{$old_ref};
}
elsif (ref($old_ref) eq 'HASH') {
$new_ref = \%{$old_ref};
}
elsif (.....
Jeśli wiesz, sędzia może być tylko jeden typ można zapisać if
/elsif
kaskadę i po prostu zrobić deref-reref, ale to jeszcze trudniej ocenić, dlaczego dereferencjonowane prostu wziąć nową adnotacje. Następny opiekun spróbuje "naprawić" twój kod.
.. czy na pewno podprogram może zwrócić słabe odniesienie?Wydaje mi się, że każde osłabione odniesienie utworzone w podprogramie byłoby ZNISZCZONE, kiedy to odniesienie wykracza poza zakres podprogramu – Dancrumb
Nie zwróci słabego wyniku odniesienia w ukrytej kopii (co spowoduje silne odniesienie są zwracane)? – Cameron
@ Dancrumb, @Cameron, możesz zwrócić przeciążony obiekt, który przechowuje osłabione odniesienie. – ysth