The*_*Pen 2 string iterator slice rust
如何将返回字符串的迭代器转换为可以传递到需要的函数中的东西&[&str]?我试图将迭代器映射到&strs 上的迭代器,但出现错误:
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()返回一个Strings 上的迭代器。如果你将它们转换为&strs,当我们调用下一个项目时,它们就会被丢弃,天啊!你的&str是悬空的。
所以我们需要一个地方来存储Strings,然后由于我们需要&[&str]而不是&[String],我们需要迭代它并再次收集它。
但请注意,服用 是完全正常的&[String]。与 不同&String,它基本上是无用的-&str总是更灵活,这在间接寻址(例如&[String]vs &[&str])后面是不正确的,正是因为我们现在所看到的。
如果您想要最大程度的宽容(例如,对于公共功能),您可以采取&[impl AsRef<str>]. 这将允许两者。然后在使用数据的时候,需要将其转换为&strusing as_ref().