版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ssss1223ss/article/details/89080485
先看下面2段代码,代码A
:
let mut a = 12;
let b = &mut a;
let c = b;
*c = 123;
println!("{}", b);
代码B
:
let mut a = 12;
let b = &mut a;
let c: &mut i32 = b;
*c = 123;
println!("{}", b);
唯一区别就是变量c
的定义不同,代码A使用了类型推导,代码B
使用了类型声明。**代码A
**无法编译通过,编译提示b
已经被moved,而代码B可以在edititon 2018
编译通过,因为默认开启了NLL
。
第一感觉,两种写法都是定义了一个&mut i32
变量,而&_ mut
未实现Copy traits
,赋值给c之后b会被move掉。但实际情况是代码B中c
只是*b
的引用,因为NLL
缘故,*c=123
之后c引用不再使用,b可以再次使用。代码B我认为可解释为变量绑定到引用变量。
看github
上两年前有人提issue
,rust
核心成员回复这是正确行为,但不是最好的行为,后期会考虑修改。