MST

星途 面试题库

面试题:Rust移动语义下变量所有权的变化

假设有如下Rust代码:```rustlet s1 = String::from("hello");let s2 = s1;println!("{}", s1);```这段代码会编译通过吗?如果不能,为什么?应该如何修改代码以正确使用移动语义并打印出期望的结果?
22.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

这段代码不会编译通过。原因是在Rust中,当执行 let s2 = s1; 时,s1 的所有权被移动到了 s2 上,此时 s1 不再有效,所以在 println!("{}", s1); 这一行会报错,因为 s1 已经被移动,不能再被使用。

要正确使用移动语义并打印出期望的结果,可以这样修改代码:

let s1 = String::from("hello");
let s2 = s1.clone();
println!("{}", s2);

在这个修改后的代码中,使用 clone 方法创建了 s1 的一个新副本 s2,这样 s1 的所有权没有被移动,仍然可以使用。

另一种方式是先打印 s1,再移动 s1 的所有权:

let s1 = String::from("hello");
println!("{}", s1);
let s2 = s1;

在这种情况下,先打印 s1,之后再将 s1 的所有权移动给 s2,也能避免编译错误。