Я бы принял другой ответ, который позволит мне избежать использования индекса.

у структуру данных в 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, Есть ли более идиоматический способ выполнить операцию обновления или вставки?

Ответы на вопрос(1)

Ваш ответ на вопрос