Reference ‘mut a:&;之间有什么区别;T`和'a:&;mut T`?

Reference ‘mut a:&;之间有什么区别;T`和'a:&;mut T`?,reference,rust,mutable,Reference,Rust,Mutable,有人能解释一下这两者之间的区别吗?什么时候使用最多的是mut a:&T?函数参数和Rust中的let绑定是正确的模式,就像match中=>左侧的模式一样(除了let和参数模式必须是无可辩驳的,也就是说,它们必须始终匹配)muta只是模式语法的一部分,它意味着a是一个可变绑定&mut T T/&T是一个类型可变或不可变的引用 参考和模式中有四种可能的mut组合: a: &T // immutable binding of immutable reference mut a

有人能解释一下这两者之间的区别吗?什么时候使用最多的是
mut a:&T

函数参数和Rust中的let绑定是正确的模式,就像match中
=>
左侧的模式一样(除了let和参数模式必须是无可辩驳的,也就是说,它们必须始终匹配)
muta
只是模式语法的一部分,它意味着
a
是一个可变绑定<另一方面,code>&mut T 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
第一个变量是绝对不可变的(不考虑
单元格
的内部可变性),您既不能更改
a
指向的对象,也不能更改它当前引用的对象

第二种变体允许您将
a
更改为指向其他地方,但不允许更改它指向的对象

第三个变量不允许将
a
更改为指向其他对象,但允许对其引用的值进行变异

最后一个变量既允许更改
a
引用其他内容,也允许更改此引用当前指向的值

考虑到上述因素,您可以看到可以在哪里使用
mut a:&T
。例如,您可以在循环中编写字符串部分的搜索,以便进一步使用,如下所示:

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