gpt4 book ai didi

vector - 如何将数据从可索引集合中移出?

转载 作者:行者123 更新时间:2023-11-29 08:06:13 25 4
gpt4 key购买 nike

I/O project example在 Rust 书中建议克隆命令行参数:

fn main() {
let args: Vec<String> = env::args().collect();
let config = parse_config(&args);
// ...
}

struct Config {
query: String,
filename: String,
}

fn parse_config(args: &[String]) -> Config {
let query = args[1].clone();
let filename = args[2].clone();

Config {
query, filename
}
}

我想将值 move 到 Config 结构中以避免复制。

我尝试 move 切片:

fn parse_config(args: [String]) -> Config

但出现错误:

the trait `std::marker::Sized` is not implemented for `[std::string::String]`

这是有道理的,因为它现在是作为未调整大小的数组读取的。接下来我尝试了泛型:

fn parse_config<T: std::ops::Index<usize, Output=String> + Sized>(args: T) -> Config

这给出了错误:

cannot move out of indexed content

这也是有道理的,因为它会将向量留在 invalid state 中.我可以 move 矢量:

fn parse_config(mut args: Vec<String>) -> Config {
let query = args.remove(1);
// ...

但现在函数绑定(bind)到特定容器 Vector

我该如何编写一个函数来使用向量并允许我移出其内容,同时仍保留函数的通用性质?

最佳答案

答案是使用消费迭代器:

    ...
let config = parse_config(args.into_iter());
...

fn parse_config<T: Iterator<Item=String>>(mut args: T) -> Config {
let query = args.nth(1).expect("First arg none");
let filename = args.nth(0).expect("Second arg none");
...
}

请注意,nth 函数正在推进并使用迭代器,因此第二个参数不是在 2 处进行索引,而是在一次迭代之后,即 0

关于vector - 如何将数据从可索引集合中移出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com