2015-04-16 3 views

ответ

15

Параметры функции и позволяют привязок в Rust являются собственные модели, как и в левой части => в матче (кроме того, что пусть и шаблоны параметров должны быть неопровержимые, то есть, они всегда должны совпадать). mut a - это всего лишь часть синтаксиса шаблона, и это означает, что a является изменяемым привязкой. &mut T/&T, с другой стороны, является изменчивой или неизменяемой ссылкой.

Есть четыре возможных комбинаций mut в ссылках и моделях:

a: &T  // immutable binding of immutable reference 
mut a: &T  // mutable binding of immutable reference 
    a: &mut T // immutable binding of mutable reference 
mut a: &mut T // mutable binding of mutable reference 

Первый вариантом является абсолютно неизменен (без учета внутренней переменчивости Cell и такой во внимание) - вы не можете ни изменить то, что a указует на ни объект, на который он ссылается.

Второй вариант позволяет вам изменить a, чтобы указать куда-то еще, но он не позволяет вам изменять объект, на который он указывает.

Третий вариант не позволяет изменить a, чтобы указать на что-то еще, но он позволяет изменять значение, которое он ссылается.

И последний вариант позволяет как изменять a ссылаться на что-то другое, так и изменять значение, на которое указывает эта ссылка.

С учетом вышесказанного вы можете увидеть, где можно использовать mut a: &T. Например, вы можете написать поиск части строки в цикле для дальнейшего использования следующим образом:

let mut s: &str = source; 
loop { 
    // ... whatever 
    s = &source[i..j]; 
} 
// use the found s here