Я бы принял другой ответ, который позволит мне избежать использования индекса.
у структуру данных в Rust. Он содержитVec
пар ключ-значение. При вставке в структуру мне нужно найти соответствующий ключ и обновить как ключ, так и значение (которое на самом деле является дочерним указателем). Код выглядит примерно так, гдеpivots
этоref mut
вVec<Pivot>
а такжеPivot
это просто структура с двумя полями:
match pivots.iter_mut().find(|ref p| key <= p.min_key) { // first mutable borrow
Some(ref mut pivot) => {
// If there is one, insert into it and update the pivot key
pivot.min_key = key;
pivot.child.insert(key, value) // recursive call
},
// o/w, insert a new leaf at the end
None => pivots.push(Pivot /* ... */) // second mutable borrow
}
Но есть проблема. Даже если я не использую изменяемый итератор во втором ответвленииmatch
, заемщик жалуется, что я не могу заимствовать*pivots
как изменяемые более одного раза за один раз ".
Это имеет смысл для меня, потому что первый заем все еще находится в объеме, даже если он не используется в этом случаеmatch
, Это немного неудобно: умный контролер наверняка скажет, что заимствования не перекрываются. Я видел в сети кого-то, кто советовал использовать досрочный возврат, чтобы избежать этой проблемы, например:
match pivots.iter_mut().find(|ref p| key <= p.min_key) {
Some(ref mut pivot) => {
pivot.min_key = key;
pivot.child.insert(key, value);
return
},
None => ()
};
pivots.push(Pivot /* ... */)
но это кажется трудным для понимания, особенно когда это означает разбиение этого кода на его собственную функцию, чтобы позволитьreturn
, Есть ли более идиоматический способ выполнить операцию обновления или вставки?