虽然我对生命周期很聪明,但编译器再次教我......
错误[E0521]:借用的数据在方法之外转义
pub struct Bugger<S> {
pub items: S,
}
impl<S> Bugger<S>
where
&'static S: IntoIterator + 'static,
<&'static S as IntoIterator>::Item: AsRef<u8>,
{
fn do_something_with_items(&self) -> impl Iterator<Item = u8> {
(&self.items).into_iter().map(|b| *b.as_ref())
}
}
我想接受一个在其引用上实现 IntoIterator 的通用成员,然后在另一个方法中使用它,实际上是一个特征实现,但即使这样也会失败。
无法编译的主要原因是因为您采用了
&self
(它必须在任何生命周期内都有效),但实现块上的绑定要求实现 IntoIterator
以作为具有 'static
生命周期的引用。因此,您在方法中使用此界限的方式要求 &self
引用也为 'static
,但您没有指出这一点。您可以通过让方法采取 &'static self
来修复此特定示例。
但是,这可能不是您想要的。最有可能的是,您想要的寿命比
'static
短。您可以在特征界限中使用更高等级特征界限 (HRTB) 来描述这一点,该界限使用关键字 for
。
您还需要在返回类型中指示返回的迭代器借用于
self
,您可以通过将匿名生命周期 '_
添加到边界来实现。
pub struct Bugger<S> {
pub items: S,
}
impl<S> Bugger<S>
where
for <'a> &'a S: IntoIterator,
for <'a> <&'a S as IntoIterator>::Item: AsRef<u8>,
{
fn do_something_with_items(&self) -> impl Iterator<Item = u8> + '_ {
(&self.items).into_iter().map(|b| *b.as_ref())
}
}