我是Rust新手,遇到类似以下问题几次:
fn main() {
let mut as_str: Vec<&String> = Vec::new();
for i in [1, 2, 3, 4, 5].iter() {
let i_str = i.to_string();
as_str.push(&i_str);
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
<anon>:6:22: 6:27 error: `i_str` does not live long enough
<anon>:6 as_str.push(&i_str);
^~~~~
Run Code Online (Sandbox Code Playgroud)
如何将字符串的所有权转移到向量(不想复制)?我需要一辈子吗?它应该是str还是String(假设我不想在向量中改变项本身)?
给出向量a String,而不是对一个向量的引用.A Foo是拥有的,&Foo是借来的.
fn main() {
let mut as_str: Vec<String> = Vec::new();
for i in [1, 2, 3, 4, 5].iter() {
let i_str = i.to_string();
as_str.push(i_str);
}
}
Run Code Online (Sandbox Code Playgroud)
在您的示例中,您String在for循环体内部分配,然后对其进行引用.由于没有任何东西String,它被丢弃在循环体的末端.这意味着任何引用都将变为无效.Rust可防止此内存安全违规.
在现实世界中,您永远不需要在此处指定类型,类型推断就足够了:
fn main() {
let mut as_str = Vec::new();
for i in [1, 2, 3, 4, 5].iter() {
let i_str = i.to_string();
as_str.push(i_str);
}
}
Run Code Online (Sandbox Code Playgroud)
你可能会用map一块东西转换成另一片东西:
fn main() {
let as_str: Vec<_> = [1, 2, 3, 4, 5].iter().map(|i| i.to_string()).collect();
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,拥有一个&String; 你可能还有一个&str.