面试题答案
一键面试所有权转移
- 概念:在Rust中,每个值都有一个变量作为其所有者。当一个变量超出其作用域时,Rust会自动调用drop函数来释放该变量所占用的资源。所有权转移指的是一个变量将其对值的所有权转移给另一个变量。当所有权转移后,原来的变量不再拥有对该值的所有权,不能再使用该值。
- 示例:
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1的所有权转移给s2
// println!("{}", s1); // 这一行会报错,因为s1不再拥有所有权
println!("{}", s2);
}
在上述代码中,s1
将其对String
类型值的所有权转移给了s2
,之后再使用s1
就会报错。
借用
- 概念:借用允许我们在不转移所有权的情况下使用值。借用分为不可变借用和可变借用。不可变借用允许多个变量同时读取值,但不允许修改值;可变借用只允许一个变量对值进行修改,并且在可变借用期间,不能有其他借用。
- 不可变借用示例:
fn main() {
let s = String::from("hello");
let len = calculate_length(&s);
println!("The length of '{}' is {}", s, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
在这个例子中,calculate_length
函数接受一个对String
的不可变借用。函数可以读取s
的值,但不能修改它。主函数在借用结束后仍然可以使用s
。
- 可变借用示例:
fn main() {
let mut s = String::from("hello");
change(&mut s);
println!("{}", s);
}
fn change(s: &mut String) {
s.push_str(", world");
}
这里,change
函数接受一个对String
的可变借用。函数可以修改s
的值。注意,s
必须是mut
可变的,并且在可变借用期间,不能有其他对s
的借用。
区别
- 所有权转移:所有权从一个变量转移到另一个变量,原变量失去对值的所有权,不能再使用该值。
- 借用:借用不转移所有权,只是在借用期间临时使用值。不可变借用允许多个同时读取,可变借用只允许一个修改,并且有借用规则来避免数据竞争。借用结束后,原变量仍然拥有所有权,可以继续使用值。