You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust所有权转移疑问:为何两段代码执行结果不同?

Rust所有权机制:两段代码差异的原因解析

第一段代码编译失败的原因

这段代码里的Computer枚举默认没有实现Copy trait。当调用print_type_of_computer(myComputer)时,会触发所有权转移(move):myComputer的所有权被完整转移到函数参数num中,函数执行完毕后num会被销毁。此时原作用域里的myComputer已不再拥有该值的所有权,变成无效变量,第二次调用自然会编译报错。

对应代码:

enum Computer{
    Desktop,
    Laptop,
}

fn print_type_of_computer(num: Computer){
    match num {
        Computer::Desktop => println!("this is a desktop"),
        Computer::Laptop => println!("this is a laptop"),
    }
}

fn main() {
    let myComputer :Computer = Computer::Laptop;
    print_type_of_computer(myComputer);
    print_type_of_computer(myComputer); // 报错:value used here after move
}

第二段代码能正常运行的原因

i32属于Rust的基本数值类型,这类类型(还包括bool、char、f32等)都默认实现了Copy trait。当把mynum传递给get_double时,Rust会自动创建值的副本传递给函数参数,原变量mynum的所有权完全不受影响,因此可以重复调用函数。

对应代码:

fn get_double(num: i32){
    println!("{:?}", num * 2);
}

fn main() {
    let mynum :i32 = 3;
    get_double(mynum);
    get_double(mynum); // 正常运行,传递的是值的副本
}

让第一段代码运行的两种方法

  • 给Computer枚举手动实现Copy trait(需同时实现Clone,因为Copy依赖Clone):
    #[derive(Copy, Clone)]
    enum Computer{
        Desktop,
        Laptop,
    }
    
  • 使用借用,传递引用而非转移所有权:
    fn print_type_of_computer(num: &Computer){
        match num {
            Computer::Desktop => println!("this is a desktop"),
            Computer::Laptop => println!("this is a laptop"),
        }
    }
    
    fn main() {
        let myComputer :Computer = Computer::Laptop;
        print_type_of_computer(&myComputer);
        print_type_of_computer(&myComputer);
    }
    

内容的提问来源于stack exchange,提问作者Hamza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:55:02