面试题答案
一键面试struct Container {
data: Vec<String>
}
fn main() {
let mut container = Container {
data: vec![
String::from("item1"),
String::from("item2"),
String::from("item3")
]
};
let borrowed_str;
{
if let Some(s) = container.data.get(1) {
borrowed_str = s;
} else {
return;
}
container.data.remove(0);
}
println!("The string at index 1 was: {}", borrowed_str);
}
解释:
- 在内部作用域,使用
get
方法获取Vec<String>
中索引为1的元素。get
方法返回一个Option<&String>
,这样可以在获取失败(索引越界)时优雅处理。 - 将获取到的
&String
赋值给外部作用域定义的borrowed_str
。 - 由于
get
返回的是一个引用,所以生命周期是自动管理的,符合借用检查机制。在获取引用后,Container
可以被修改,例如删除第一个元素container.data.remove(0)
,只要不影响到borrowed_str
的生命周期即可。 - 在外部作用域使用
borrowed_str
。如果get
操作失败,直接从main
函数返回,避免未定义行为。