gpt4 book ai didi

rust - 在结构中存储HashMap的迭代器

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

编辑
从建议的解决方案看来,我试图实现的目标似乎是不可能/不是正确的方法,因此-我将在此处解释最终目标:
我正在使用serde从YAML文件中解析Foo的值,并且我想让用户一次从yaml中获取这些存储的值之一,这就是为什么我要在结构中存储迭代器的原因

我有两个类似于以下的结构:

struct Bar {
name: String,
id: u32
}

struct Foo {
my_map: HashMap<String, Bar>
}
在我的 Foo结构中,我希望将迭代器存储到我的HashMap中,以便用户可以按需从我的 map 借用值。
从理论上讲,完整的Foo类将类似于:
struct Foo {
my_map: HashMap<String, Bar>,
my_map_iter: HashMap<String, Bar>::iterator
}

impl Foo {
fn get_pair(&self) -> Option<(String, Bar)> {
// impl...
}
}
但是无论如何尝试,我似乎都无法实现它并创建这样的变量(各种编译错误,似乎我只是在尝试做错事)。
如果有人可以为我指出实现此目标的正确方法,并且如果有更好的方法实现我想做的事情,我将感到非常高兴-我想知道这一点。
谢谢!

最佳答案

I am parsing the values for Foo from a YAML file using serde


解析它们时,应将值放在 Vec中,而不是 HashMap中。
我想您具有的值也有名称,这就是为什么您认为 HashMap会很好。您可以这样存储它们:
let parsed = vec![]

for _ in 0..n_to_parse {
// first item of the tuple is the name second is the value
let key_value = ("Get from", "serde");
parsed.push(key_value);
}
然后像这样存储它之后,通过跟踪当前索引很容易从中获取对:
struct ParsedHolder {
parsed: Vec<(String, String)>,
current_idx: usize,
}

impl ParsedHolder {
fn new(parsed: Vec<(String, String)>) -> Self {
ParsedHolder {
parsed,
current_idx: 0,
}
}

fn get_pair(&mut self) -> Option<&(String, String)> {
if let Some(pair) = self.parsed.get(self.current_idx) {
self.current_idx += 1;
Some(pair)

} else {
self.current_idx = 0;
None
}
}
}
现在,可以通过使用 VecDeque进一步改进它,这将使您有效地取出解析的第一个元素。这将使不使用克隆变得容易。但是这样一来,您将只能浏览所有解析的值一次,我认为这实际上是您在用例中想要的。
但是我让你实现 VecDeque😃

关于rust - 在结构中存储HashMap的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66354160/

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