我有一个带有函数的特征,该函数将闭包作为参数,而闭包采用的参数必须是实现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/