在
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 干净并且不公开这些。
我是否有理由不明白我所做的事情是错误的?如果允许的话,怎么能打破它呢?这是一个已知问题吗?
正如评论中提到的,以下工作:
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut dyn System> {
self.inner.values_mut().map(|b| { b.as_mut() })
}
这真的很奇怪,也许只是编译器问题? 无论如何,这个可以关闭了。