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

Rust convert iterator over String to &[&str]

提问人:The Bic Pen 提问时间:10/16/2023 更新时间:10/16/2023 访问量:58

问:

如何将返回 Strings 的迭代器转换为可以传递给函数的内容?我正在尝试将迭代器映射到 s 上的迭代器,但出现错误:&[&str]&str

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

为什么会发生此错误? 是 main 中的局部变量,因此它的生存期肯定会延长到函数的末尾,因此在整个调用过程中都处于活动状态。argsparse_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
}
字符串 蚀迭代器 切片

评论


答:

8赞 Chayim Friedman 10/16/2023 #1

你需要两次,第一次进入,然后迭代它,它变成: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);

这是因为返回一个迭代器 over s。如果将它们转换为 s,则当我们调用下一项时,它们会被丢弃,然后!你晃来晃去。std::env::args()String&str&str

因此,我们需要某个地方来存储 s,然后既然我们需要并且不需要,我们需要迭代它并再次收集它。String&[&str]&[String]

但请注意,服用是完全没问题和正常的。与 不同,它基本上是无用的 - 总是更灵活,这在间接后面不是真的,比如 vs ,正是因为我们现在看到的。&[String]&String&str&[String]&[&str]

如果你想最大限度地宽容(例如,对于公共功能),你可以采取 .这将允许两者兼而有之。然后,当您使用数据时,您需要将其转换为使用 。&[impl AsRef<str>]&stras_ref()