【发布时间】:2025-12-13 13:40:01
【问题描述】:
我正在尝试创建一个包装另一个数据结构(我们称之为Inner)的数据结构(我们称之为Outer)。但是,我不想为Inner 修复一个实现,而是想使用一个特征,以便我可以轻松地交换这个底层数据结构的实现。
简化版看起来有点像这样:
pub struct Outer<K, V, I>
where
I: Inner<K, V>
{
inner: I,
// some phantom data fields
}
pub trait Inner<K, V>
{
...
}
现在,我想向Outer 添加一个迭代器,它还应该包装内部数据结构提供的迭代器,问题就来了。
在Inner 特质中,我不能写:
fn iter(&self) -> impl Iterator<Item = (&'_ K, &'_ V)>;
因为这里不允许使用impl Trait 语法,我也不能引入类似的关联类型:
type Iterator<'a>: Iterator<Item = (&'a K, &'a V)>;
因为generic associated types 还不存在。
到目前为止,我想出的是为迭代器提供一个单独的特征:
pub trait InnerIterator<'a, K: 'a, V: 'a>: Iterator<Item = (&'a K, &'a V)> {
type Inner: Inner<K, V>;
fn new(inner: &'a Self::Inner) -> Self;
}
然后Outer收到一个新的泛型类型参数InnerIt:
pub struct Outer<K, V, I, InnerIt>
where
I: Inner<K, V>
{
inner: I,
// some phantom data fields
}
impl<K, V, I, InnerIt> Outer<K, V, I, InnerIt> {
pub fn iter<'a>(&'a self) -> InnerIt
where
I: Inner<K, V>,
InnerIt: InnerIterator<'a, K, V, Inner = I>,
K: 'a,
V: 'a,
{
InnerIt::new(&self.inner)
}
}
现在,当我想选择一些特定的 Inner 实现时,我有类似的东西:
pub type SomeOuter<'a, K, V> = Outer<K, V, SomeInner<K, V>, SomeInnerIterator<'a, K, V>>;
这里的生命周期参数'a 成为我的类型定义的一部分。
除了我必须添加至少两个参数来启用iter_mut 和into_iter 的问题之外,我的问题是在此设置'a 参数会产生什么后果,它会继续传播吗?进一步使用这种类型时,这种类型的用户会不会对这个生命周期参数感到惊讶,有没有办法在不引入泛型迭代器类型及其生命周期的情况下实现迭代器Outer?
【问题讨论】: