Rust语言中match的工作机制问题
Rust初学小白,前几天刚看到这门年轻的语言就开始动手学习,学习了也快有半个星期了。
不得不说Rust的语法上有好多不甚明白的地方,比别的语言的入门门槛都要高。
比如这个问题.....
代码1:
let mut num1 = 1000;
let mut num2 = &mut num1;
println!("{}",num2);
*num2 += 100;
println!("{}",num2);
这样的输出结果为:
1000
1100
也正如意料之中,num2 是一个指向 num1 的指针。
代码2:
let mut op = Some(100);
match op {
None => {}
Some(mut x) => {
let mut change = &mut x;
*change += 1000;
println!("{:?}",*change);
}
}
println!("{:?}",op);
按照我对于match的理解,我认为这里的
Some(mut x) => {....}
相当于
let mut x = ....
x的类型应该是一个&mut i32
那么change的类型应该是 &mut &mut i32 => &mut i32
也确实输出的结果为
1100
Some(100)
为什么里面的change可以改变,而外面的op没有改变呢,它们不应该是同一段地址吗?
如果不是同一段地址,那么match关键字对于后面的变量做了什么事情呢?
欢迎大家讨论。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
改为这样,输出为
现在让我们测试一下是否发生了拷贝
编译,出现错误
可以看到,match获得了op的所有权,因此op失效。而作为i32类型,op是不会失效的,因此发生了一次复制
而利用ref获得的是原变量的指针,因此不会发生所有权转移