借用和内部IntoIterator

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

虽然我对生命周期很聪明,但编译器再次教我......

错误[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 的通用成员,然后在另一个方法中使用它,实际上是一个特征实现,但即使这样也会失败。

rust lifetime
1个回答
0
投票

无法编译的主要原因是因为您采用了

&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())
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.