< 返回版块

shanqiang0304 发表于 2021-01-04 10:01

Tags:指针,所有权

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);

//这三者的输出结果是一样的,是不是说明这些都对值进行了复制

评论区

写评论
qianlv 2021-01-15 19:36

3这个例子,说明rust允许名称复用,带来的一个了弊端

eweca 2021-01-05 22:18

个人理解。 1和2是一样的,因为基础类型实现了copy这个trait,所以赋值的时候原变量都不会移动,是复制了数据放到变量b的。 3这个情况是,a变量指向的内存存有数据1;然后b变量指向的内存指向a变量现在的内存地址,这个地址有数据1;然后let重新为a变量绑定了一个新内存地址,数据为2。显然,b变量仍然指向原a变量地址,这个地址内存有数据1,所以打印出1。值没有被复制到b变量上。

xin-water 2021-01-04 22:28

1 let 变量屏蔽, 2 基本数据类型 实现了copy接口, 所以它在 赋值 时,先进行复制,然后再将复制的值移动到变量里。

3 let b = &a,意思是先读取a的借用(内存地址),然后将地址存放到变量b中。

4 不要老是提所有权,你只要知道 数据是移动、克隆后移动、复制后移动就行了。 复制后移动,则原来的内存里还有数据,就能访问; 直接移动,则原来的内存里就没数据了,也就不能访问了。

gotope 2021-01-04 15:19

你用Let 重新定义了新变量只不过名字相同,如楼上所说的问题

uno 2021-01-04 10:12

名称遮蔽

1 共 5 条评论, 1 页