Rust语言中match的工作机制问题

发布于 2022-09-11 15:50:43 字数 960 浏览 23 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一影成城 2022-09-18 15:50:43
let mut op = Some(100);
match op {
    None => {}
    Some(ref mut x) => {
        let mut change = x;
        *change += 1000;
        println!("{:?}",*change);
    }
}
println!("{:?}",op);

改为这样,输出为

1100
Some(1100)

现在让我们测试一下是否发生了拷贝

struct Data {
    dat: i32
}

impl std::clone::Clone for Data {
    fn clone(&self) -> Data{
        println!("object cloned");
        Data {dat: self.dat}
    }
}

impl std::fmt::Debug for Data {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "{:?}", self.dat)
    }
}

fn main() {
    let mut op = Some(Data {dat: 100});
    match op {
        None => {}
        Some(mut x) => {
            let mut change = &mut x;
            (*change).dat += 1000;
            println!("{:?}",change);
        }
    }
    println!("{:?}",op);
}

编译,出现错误

error[E0382]: use of partially moved value: `op`
  --> src\main.rs:28:21
   |
22 |         Some(mut x) => {
   |              ----- value moved here
...
28 |     println!("{:?}",op);
   |                     ^^ value used here after move
   |
   = note: move occurs because the value has type `Data`, which does not implement the `Copy` trait

可以看到,match获得了op的所有权,因此op失效。而作为i32类型,op是不会失效的,因此发生了一次复制
而利用ref获得的是原变量的指针,因此不会发生所有权转移

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文