gpt4 book ai didi

rust - 在向量中某个元素之后插入的惯用方式

转载 作者:行者123 更新时间:2023-12-03 11:27:53 24 4
gpt4 key购买 nike

考虑以下代码:

struct Data {
id: i32,
}

struct Wrapper {
datas: Vec<Data>,
}

impl Wrapper{
fn insert_after(&mut self, id: i32, new_data: Data) {
let mut index = None;
for (i, data) in self.datas.iter().enumerate() {
if data.id == id {
index = Some(i);
break;
}
}
if let Some(index) = index {
self.datas.insert(index, new_data);
}
}
}
有没有一种方法可以仅使用迭代器而不使用 insert_after循环来实现与 for相同的功能?有没有办法删除附加的 if语句和可选的index变量?

最佳答案

是的,迭代器具有 position 方法,可让您找到与谓词匹配的元素的索引:

fn insert_after(&mut self, id: i32, new_data: Data) {
if let Some(index) = self.datas.iter().position(|x| x.id == id) {
self.datas.insert(index, new_data);
}
}
我想不出一种更易读的方式来表达这一点,尽管如果您真的想摆脱 if let,则可以使用 Option::map :
fn insert_after(&mut self, id: i32, new_data: Data) {
self.datas.iter().position(|x| x.id == id).map(|index| {
self.datas.insert(index, new_data);
});
}
虽然这可以说是不太可读。

关于rust - 在向量中某个元素之后插入的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65191637/

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