面试题答案
一键面试这段代码不会编译通过。原因是在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
,也能避免编译错误。