我以为我变聪明了,但编译器又教了我一次...

错误[E0521]:borrow 的数据在方法之外转义

play


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,然后在另一个方法中使用它,实际上是一个特征Iml,但即使这样也失败了.

推荐答案

编译失败的主要原因是因为你取了&self(它在任何生存期都必须有效),但是实现块上的绑定要求为IntoIterator来实现一个生存期为'static的引用.因此,在方法中使用此边界的方式要求&self引用也是'static,但您没有指出这一点. 您可以通过让方法取&'static self来修复这个特定的示例.

然而,无论如何,这可能不是您想要的.最有可能的是,你希望自己的生命周期 短于'static岁.你可以用higher-rank trait bound(HRTB)来描述这一点.

您还需要在返回类型中指示返回的迭代器从selfborrow ,这可以通过将匿名生存期'_添加到界限来实现.

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())
    }
}

(Playground)

请注意,匿名生命周期只是语法上的糖:

fn do_something_with_items<'a>(&'a self) -> impl Iterator<Item = u8> + 'a

Rust相关问答推荐

为什么拥有的trait对象的相等运算符移动了正确的操作数?

如何最好地并行化修改同一Rust向量的多个切片的代码?

在泛型 struct 的字段声明中访问关联的Conant

限制未使用的泛型导致编译错误

使用Box优化可选的已知长度数组的内存分配

如何定义实现同名但返回类型不同的 struct 的函数

在0..1之间将U64转换为F64

在 Rust 中用问号传播错误时对类型转换的困惑?

为什么我必须使用 PhantomData?在这种情况下它在做什么?

tokio::spawn 有和没有异步块

返回优化后的标题:返回异步块的闭包的类型擦除

pyO3 和 Panics

rust 中不同类型的工厂函数

在 FFI 的上下文中,未初始化是什么意思?

为什么分配对变量的引用使我无法返回它

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

如何在 Rust 中构建一个 str

返回引用的返回函数