迭代器中的解引用框在可变时会中断

问题描述 投票:0回答:1

HashMap<TypeId, Box<dyn MyTrait>>
上构建包装器类型时,我遇到了一个无法理解的错误:

以下函数适用于所有元素的迭代:

pub fn iter(&self) -> impl Iterator<Item = &dyn System> {
    self.inner.values().map(Box::as_ref)
}

但是,当我尝试以可变的方式编写相同的内容时,我遇到了终身错误:

pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut dyn System> {
    self.inner.values_mut().map(Box::as_mut)
}

错误:“一生可能活得不够长 返回此值要求

'1
必须比
'static
"

更长寿

我尝试在函数声明中指定生命周期以使其工作,但没有成功。我不明白为什么第二个版本会中断?

我知道我可以将返回类型更改为可变框上的迭代器,但我想保持 API 干净并且不公开这些。

我是否有理由不明白我所做的事情是错误的?如果允许的话,怎么能打破它呢?这是一个已知问题吗?

rust
1个回答
0
投票

正如评论中提到的,以下工作:

pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut dyn System> {
    self.inner.values_mut().map(|b| { b.as_mut() })
}

这真的很奇怪,也许只是编译器问题? 无论如何,这个可以关闭了。

© www.soinside.com 2019 - 2024. All rights reserved.