提问人:The Bic Pen 提问时间:10/16/2023 更新时间:10/16/2023 访问量:58
Rust 将 String 上的迭代器转换为 &[&str]
Rust convert iterator over String to &[&str]
问:
如何将返回 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 中的局部变量,因此它的生存期肯定会延长到函数的末尾,因此在整个调用过程中都处于活动状态。args
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
}
答:
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>]
&str
as_ref()
评论