let a = 1;
let b = a.clone();
let a = 2;
println!("{}", b);
let a = 1;
let b = a;
let a = 2;
println!("{}", b);
let a = 1;
let b = &a;
let a = 2;
println!("{}", b);
//这三者的输出结果是一样的,是不是说明这些都对值进行了复制
1
共 5 条评论, 1 页
评论区
写评论3这个例子,说明rust允许名称复用,带来的一个了弊端
个人理解。 1和2是一样的,因为基础类型实现了
copy
这个trait
,所以赋值的时候原变量都不会移动,是复制了数据放到变量b
的。 3这个情况是,a
变量指向的内存存有数据1
;然后b
变量指向的内存指向a
变量现在的内存地址,这个地址有数据1
;然后let
重新为a
变量绑定了一个新内存地址,数据为2
。显然,b
变量仍然指向原a
变量地址,这个地址内存有数据1
,所以打印出1
。值没有被复制到b
变量上。1 let 变量屏蔽, 2 基本数据类型 实现了copy接口, 所以它在 赋值 时,先进行复制,然后再将复制的值移动到变量里。
3 let b = &a,意思是先读取a的借用(内存地址),然后将地址存放到变量b中。
4 不要老是提所有权,你只要知道 数据是移动、克隆后移动、复制后移动就行了。 复制后移动,则原来的内存里还有数据,就能访问; 直接移动,则原来的内存里就没数据了,也就不能访问了。
你用Let 重新定义了新变量只不过名字相同,如楼上所说的问题
名称遮蔽