Как выяснилось, благодаря всем правилам доступа, в Рже не только нельзя сделать обычные списки, но и нельзя просто взять и отсортировать ссылки на объекты в массиве/векторе. Для сортировки нужно:
1. Создать и отсортировать вектор индексов объектов в первом массиве ("создать план")
2. Переместить ссылки из вектора во временный вектор через операцию drain, более конкретно магическим заклинанием:
let mut old_data: Vec<Option<MyObject>> =
data.drain(..).map(Some).collect();
3. Переместить ссылки назад в правильном порядке через операцию take:
for data_id in plan {
data.push(
old_data[data_id.index()]
.take()
.expect("Item already taken during topological sort"),
);
}
Я не уверен, насколько при этом перемещаются ссылки, и насколько собственно данные. А в более дубовой реализации, где программист (или ИИ) поленился правильно поперемещать все, выходит еще и полное копирование через clone().
Еще раз выходит язык, непригодный для живых людей, такие эпические паттерны исполнять на каждый чих способен только ИИ, и то без присмотра норовит резать углы.
P.S. А нет, это похоже наши писатели так написали. Две опции можно поменять содержимым через swap(), так что и обычная сортировка _должна_ работать.