我有一个基本(可能很愚蠢的)所有权问题。 我正在尝试从包含在Some(String)
中的String
值中创建&str
向量。 我使用一个中间变量来存储提取/解包的String
,并且似乎需要在向量之前定义这个中间变量才能满足借用检查器:
工作代码:
fn main() {
let a = Some("a".to_string());
let mut val = String::new();
let mut v = Vec::<&str>::new();
if a.is_some() {
val = a.unwrap();
v.push(&val[..]);
}
println!("{:?}", val);
}
无法运行的代码:
fn main() {
let a = Some("a".to_string());
let mut v = Vec::<&str>::new();
let mut val = String::new();
if a.is_some() {
val = a.unwrap();
v.push(&val[..]);
}
println!("{:?}", val);
}
编译器错误:
<anon>:9:17: 9:20 error: `val` does not live long enough
<anon>:9 v.push(&val[..]);
^~~
<anon>:4:35: 12:2 note: reference must be valid for the block suffix following statement 1 at 4:34...
<anon>:4 let mut v = Vec::<&str>::new();
<anon>:5 let mut val = String::new();
<anon>:6
<anon>:7 if a.is_some() {
<anon>:8 val = a.unwrap();
<anon>:9 v.push(&val[..]);
...
<anon>:5:32: 12:2 note: ...but borrowed value is only valid for the block suffix following statement 2 at 5:31
<anon>:5 let mut val = String::new();
<anon>:6
<anon>:7 if a.is_some() {
<anon>:8 val = a.unwrap();
<anon>:9 v.push(&val[..]);
<anon>:10 }
...
error: aborting due to previous error
playpen: application terminated with error code 101
问题是:为什么我要在向量v
之前定义val
变量?在我看来,val
的作用域与v
的作用域相同,或者我漏掉了什么?
let (mut v, mut val) = (Vec::<&str>::new(), String::new());
。 - mhristachev
和val
同时声明时,它们的销毁顺序是什么?因为你仍然需要在v
之后销毁val
,编译器是否能推断出正确的顺序呢? - Matthieu M.let x; let y; ...
被解析为let x; { let y; { ... }}
。后者在技术上是语法糖,它使得满足第一部分限制更容易。我最好的猜测是"结构体严格比某个引用更长寿"的要求不适用于Vec,可能是因为它仍然使用#[unsafe_destructor]
或者因为它没有生命周期参数?那么两者具有相同的生命周期将是可行的。 - user395760