首页 > 解决方案 > 如何为将成为闭包参数的关联类型指定生命周期?

问题描述

我有一个函数的特征,这个函数接受一个闭包作为参数,而该闭包接受一个参数,该参数需要是实现该Read特征的某种类型:

trait CanRead {
    type Reader: io::Read;
    
    fn do_reading<F>(&mut self, fun: F)
    where F: FnOnce(&mut Self::Reader);
}

Read通过指定并在函数中type Reader = Self;运行,我可以轻松地为已经实现的任何东西实现这个特征。fun(self);do_reading

挑战是,我还想为某些类型实现这个特性,它必须创建一个u8s 的临时向量。那么关联类型Reader需要是引用类型,但是不知道给它什么生命周期:

pub struct EmptyStruct { }

impl CanRead for EmptyStruct {
    type Reader = &[u8]; // doesn't compile; must specify a lifetime here
    
    fn do_reading<F>(&mut self, fun: F)
    where F: FnOnce(&mut Self::Reader) {
        let temp = vec![1, 2, 3];
        fun(&mut &temp[..]);
    }
}

我知道我需要指定一个生命周期,但它可能是什么?我查看了这个有用的相关问题,但建议的方法都不起作用。问题是类型的生命周期实际上与实例Reader的生命周期无关;EmptyStruct相反,Reader引用类型只需要不超过对闭包本身的调用。是否有某种方法可以在 Rust 中指定这一点,或者另一种方法来解决这种模式?

游乐场有我试过但没用的东西。

(注意,我知道对于这个特定的代码,temp向量可以用静态数组替换,但这不适用于我真正需要做的事情。)

标签: rustlifetime

解决方案


好吧,不幸的是你还不能。引用的答案指出了一个 GAT,这将是一个解决方案(一旦实施)。是涵盖该案例的 rfc (和跟踪问题)。


推荐阅读