rust - 如何为将作为闭包参数的关联类型指定生存期?

标签 rust lifetime

我有一个带有函数的特征,该函数将闭包作为参数,而闭包采用的参数必须是实现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的任何东西实现此特征。
挑战是,我还想对某些必须实现u8的临时向量的类型实现此特征。然后,关联的类型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[..]);
    }
}
我知道我需要指定一个生命周期,但是那会是什么?我查看了this helpful related question,但没有一种建议的方法有效。问题在于Reader类型的生存期实际上与EmptyStruct实例的生存期无关。相反,Reader引用类型只需要不超过对闭包本身的调用。是否有某种方法可以在Rust中指定此方法,还是可以解决该模式的另一种方法?
playground有我尝试的方法,但没有奏效。
(请注意,对于这个特定的代码,我知道temp向量可以用静态数组代替,但这对我真正需要做的工作无效。)

最佳答案

好吧,不幸的是您还不能。 referenced回答指出了GAT,这将是一个解决方案(实现后尽快解决)。 Here's rfc(和tracking issue)涵盖了这种情况。

关于rust - 如何为将作为闭包参数的关联类型指定生存期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62588973/

相关文章:

struct - Rust 中解析器结构的生命周期

rust - 如何修复 : expected concrete lifetime, 但找到绑定(bind)的生命周期参数

c++ - 对结构成员的临时绑定(bind)引用

rust - 如何将引用参数传递给盒装闭包?

rust - 将异步函数的错误返回给同步函数的调用者

rust - 为什么没有为简单的异步 fn 返回状态实现处理程序特征?

c++ - 与 const 引用关联的临时对象的生命周期(方法链接)

rust - 无法将字符串拆分为具有显式生命周期的字符串切片,因为该字符串的生命周期不够长

rust - 为什么我需要一个 C++ 编译器来编译 Rust?

rust - 在循环中发生变异时,可变借用时间过长