[英]how to implement an iterator that delegates to HashMap::values()
我正在尝试实现一个数据结构来分组存储“寄存器”。 有一个主列表,我正在考虑注册数据的所有者。
我有以下内容:
use std::collections::hash_map::HashMap;
pub struct Register {
pub name: String,
pub address: u16,
}
// map with references to 'master' list of registers
type RegisterMap<'a> = HashMap<String, &'a Register>;
struct RegisterGroup<'a> {
start_address: u16,
registers: RegisterMap<'a>,
}
struct RegisterGroupIter<'a> {
inner: std::collections::hash_map::Values<'a,String,&'a Register>,
}
impl<'a> Iterator for RegisterGroupIter<'a> {
type Item = &'a Register;
fn next(&mut self) -> Option<&'a Register> {
self.inner.next()
}
}
impl<'a> RegisterGroup<'a> {
// return iterator over references to Register
fn registers(&self) -> RegisterGroupIter {
RegisterGroupIter {
inner: self.registers.values(),
}
}
}
这是合理/惯用的吗? 如果是这样,项目类型 wrt 引用/寿命等的正确设置是什么? 否则我应该怎么做?
Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
--> src/main.rs:22:9
|
21 | fn next(&mut self) -> Option<&'a Register> {
| -------------------- expected `std::option::Option<&'a Register>` because of return type
22 | self.inner.next()
| ^^^^^^^^^^^^^^^^^ expected struct `Register`, found `&Register`
|
= note: expected enum `std::option::Option<&'a Register>`
found enum `std::option::Option<&&'a Register>`
由于HashMap
的 values 迭代器产生对 values 类型的引用,并且在这种情况下 values 类型本身就是一个引用,因此迭代器项的类型是&&Register
。 这意味着您需要先取消引用这些项目,然后再将它们返回到您的迭代器中。 在选项中取消引用的最简单方法是使用copied()
方法:
impl<'a> Iterator for RegisterGroupIter<'a> {
type Item = &'a Register;
fn next(&mut self) -> Option<&'a Register> {
self.inner.next().copied()
}
}
我不确定您为什么将名称存储为 hash map 键和Register
结构内。 我通常会尝试规范化数据,只将名称命名为 map 键。
您实际上并不需要在这里实现自己的迭代器类型。 直接返回 hash map 的值迭代器就可以了:
impl RegisterGroup<'_> {
fn registers(&self) -> impl Iterator<Item = &Register> {
self.registers.values().copied()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.