2016-02-22 4 views
3

Как бы вы мутировали вектор таким образом, чтобы вам понадобилась неизменяемая ссылка на указанный вектор, чтобы определить, как вам нужно будет мутировать вектор? Например, у меня есть кусок кода, который выглядит примерно так, и я хочу, чтобы дублировать последний элемент вектора:Идиоматически доступ к элементу вектора изменчиво и неизменно

let mut vec: Vec<usize> = vec![123, 42, 10]; 
// Doesn't work of course: 
vec.push(*vec.last().unwrap()) 
// Works, but is this necessary? 
let x = *vec.last().unwrap(); 
vec.push(x); 

ответ

4

непреложной ссылку [...], чтобы определить, как вам нужно будет мутировать вектор?

Короткий ответ: нет. Любая мутация к вектору может возможно аннулировать все существующие ссылки, делая любые будущие операции доступными недействительными данными, что может вызвать segfaults. Безопасная ржавчина не допускает такой возможности.

Ваш второй пример создает копию значения в векторе, поэтому уже не имеет значения, что происходит с вектором; это значение будет оставаться в силе.

Что является неудачным в первом примере, так это то, что если вы будете следовать порядку операций, человек может сказать, что неизменяемое значение извлекается до того, как произойдет мутация. Фактически, поэтому версия с несколькими утверждениями вообще возможна! Это действительно текущее ограничение проверки Rust заимствования. Существует investigation ongoing, чтобы узнать, можно ли снять некоторые из этих типов ограничений.

+0

Так что, помимо копирования, нет никакого безопасного способа сделать это? – lochnesscookie

+0

О, хорошо, спасибо за разъяснение! – lochnesscookie