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枚举手动实现Copytrait(需同时实现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
相关产品推荐
相关产品推荐

