Я понимаю в чём проблема, и я не говорю, что нельзя выкрутится в этой ситуации. Я говорю, что придётся городить огород мозголомных API.Например, заворачивать все ноды в RefCell, чтобы динамически проверять правила борроу-чекера. (фууу, динамически). Можно подумать о том, какие именно наборы нодов мне надо выбирать, и создать способ описания набора, передавать в структуру это описание и лямбду, с тем чтобы она сделала бы нужную выборку нодов, и передала бы в мою лямбду эту выборку массивом.
Вероятно можно и другие способы придумать, но суть остаётся той же: куча геморроя на, казалось бы, ровном месте.
> Cell<i32> - zero-cost обёртка над i32
Она лишь условно zero-cost. Она zero-cost в том смысле, что не надо заморочного рантайма, и что она добавляет O(1) сложности. Но это не значит, что она обходится бесплатно. Если ты попробуешь сделать для одного и того же RefCell<T> два borrow, то получишь панику: RefCell при создании ссылки проверяет не существует ли ещё одной. Точнее два borrow прокатят, но если один из них будет borrow_mut, то вот тогда ты получишь панику.
Кроме того, все эти Option<Arc<RefCell<SomeThing>>> иногда начинают напрягать. Особенно когда это накладывается на Result<Result<T, E1>, E2>.
> Если разные ноды принадлежат разным частям структуры (то есть алиасинг исключён), раст позволит это сделать:
Сможет, если он сможет проверить, что они принадлежат разным частям структуры. Выше, в #446, я привёл пример, где борроу-чекер самым тупым образом не справляется. Всё что потребовалось, для того, чтобы получить этот результат -- вынести создание ссылки в функцию. Проблема в том, что приходится сталкиваться с ситуациями, когда я могу доказать, что они всегда будут принадлежать разным частям структуры, а борроу-чекер -- нет. И из-за этого мне приходится либо доставать unsafe, либо скатываться на позорные динамические проверки. Причём, поскольку unsafe отменяет проверки, это значит что когда потом я внесу изменение в какой-нибудь другой код, и так случится что станет возможным создание двух ссылок на один и тот же кусок кода, то борроу-чекер нихрена не проверит, и динамической проверки нет, то есть я тупо впорюсь в баг, достойный C-программиста.
У всех этих проверок есть пределы возможностей, и эти пределы иногда реально путаются под ногами.