The most hilarious Rust problem
Apr. 29th, 2022 09:36 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Задачка на leetcode: To detect if list has a cycle.
Для Rust этой проблемы нет. В буквальном и переносном смысле. В Rust'е не может быть канонического списка с циклом, потому что если A владеет B, а B владеет A, то вы просто не можете такой список передать по значению, потому что в таком цикле все владельцы заняты. Более того, если A->B->C->B..., то вы не можете такой список сделать, потому что второго владельца у B не может быть.
Понятно, что в районе unsafe rust можно и не такого накрутить, и есть Rc, но как каноический список вида Option<Box<Node>> с циклами в Rust не возможен.
no subject
Date: 2022-04-29 11:29 pm (UTC)no subject
Date: 2022-04-30 08:29 am (UTC)Да, потому что есть правило, что кто элементом владеет, тот её и освобождает. Если у тебя два линка на элемент, то кто владеет элементом? Безусловно, мы можем сказать что-то специальное по этому поводу (и написать особый небезопасный код), но в целом, если мне на вход подали HEAD от double-linked list (в режиме own), то я не могу его просто deallocate, потому что у кого-то образуется dangling pointer.
Чем больше я погружаюсь в эти нюансы и смыслы, тем больше я понимаю, насколько офигенной является модель ownership.