如何将返回字符串的迭代器转换为可以传递到采用
&[&str]
的函数中的内容?我试图将迭代器映射到 &str
s 上的迭代器,但出现错误:
error[E0515]: cannot return reference to function parameter `s`
--> src/main.rs:89:52
|
89 | let args: Vec<&str> = std::env::args().map(|s| s.as_str()).collect();
| ^^^^^^^^^^ returns a reference to data owned by the current function
为什么会出现这个错误?
args
是 main 中的局部变量,因此它的生命周期肯定会延伸到函数的末尾,因此在整个 parse_args
调用期间都处于活动状态。
如果函数应该采用不同的类型,我可以更改它,但我的印象是这种类型对于我的目的来说是正确的 - 我不需要对向量的拥有访问权限,也不需要对值的拥有访问权限。
这是重现错误的代码:
fn main() {
let args: Vec<&str> = std::env::args().map(|s| s.as_str()).collect();
let config = parse_args(&args);
// do stuff with config
}
fn parse_args(args: &[&str]) {
// parse args
}
您需要
collect()
两次,首先进入Vec<String>
,然后迭代并collect()
进入Vec<&str>
:
let args: Vec<String> = std::env::args().collect();
let args: Vec<&str> = args.iter().map(|v| v.as_str()).collect();
let config = parse_args(&args);
这是因为
std::env::args()
返回 String
上的迭代器。如果您将它们转换为 &str
,当我们调用下一个项目时,它们就会被丢弃,天啊!你的 &str
悬空着。
所以我们需要某个地方来存储
String
,然后由于我们需要 &[&str]
而不是 &[String]
,我们需要迭代它并再次收集它。
但请注意,服用
&[String]
是完全正常的。与 &String
不同,基本上没用 - &str
总是更灵活,在间接后面并非如此,例如 &[String]
与 &[&str]
,正是因为我们现在所看到的。
如果您想要最大程度的宽容(例如,对于公共职能),您可以采取
&[impl AsRef<str>]
。这将允许两者。然后当你使用数据时,需要使用&str
将其转换为as_ref()
。