面试题答案
一键面试所有权和借用规则应用
- 所有权:Rust 中,每个值都有一个变量作为其所有者。但对于
MyStruct
中的data
字段是字符串切片&str
,它是对某个字符串的借用,而不是拥有所有权。MyStruct
实例本身有所有权,当实例传递给函数时,所有权转移给该函数。 - 借用:
data
字段是借用,所以必须遵守借用规则:- 同一时间只能有一个可变借用,或者可以有多个不可变借用。
- 借用的生命周期必须小于等于被借用数据的生命周期。
代码示例
struct MyStruct {
data: &str,
}
// 定义一个函数来接收 MyStruct 实例
fn print_struct(s: MyStruct) {
println!("Data in MyStruct: {}", s.data);
}
// 定义一个函数来创建 MyStruct 实例并传递给另一个函数
fn create_and_pass() {
let s = "Hello, Rust!";
let my_struct = MyStruct { data: s };
print_struct(my_struct);
// 这里 my_struct 已经转移到 print_struct 函数中,不能再使用
}
fn main() {
create_and_pass();
}
在这个示例中,create_and_pass
函数创建了 MyStruct
实例,并将其传递给 print_struct
函数。由于 data
是借用,只要借用的字符串(这里是字符串字面量,生命周期为整个程序)存在,MyStruct
实例就可以安全使用。print_struct
函数接收 MyStruct
实例的所有权,函数结束后,MyStruct
实例被销毁。这样就避免了悬垂引用等错误。