Rust 将 String 上的迭代器转换为 &[&str]

问题描述 投票:0回答:1

如何将返回字符串的迭代器转换为可以传递到采用

&[&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
}
string rust iterator slice
1个回答
0
投票

您需要

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()

© www.soinside.com 2019 - 2024. All rights reserved.