Может ли кто-нибудь объяснить, в чем разница между этими двумя и когда mut a: &T
чаще всего используется?В чем разница между `mut a: & T` и` a: & mut T`?
ответ
Параметры функции и позволяют привязок в 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