我的代码有一个'。。。当我为FileSlice
实现From<T>
特征时,由于FlieSlice
引用了from
方法的参数,并且该参数在方法返回时被丢弃,因此出现"生存时间不够长"错误。
有办法解决这个问题吗?非常感谢。
struct FileSlice {
data: Box<dyn FileHandle>,
}
trait FileHandle {
fn read(&self, range: Range<usize>);
}
impl FileHandle for &'static [u8] {
fn read(&self, range: Range<usize>) {
let a = &self[range];
println!("{:?}", a);
}
}
impl<T> From<T> for FileSlice
where
T: Deref<Target = [u8]> + 'static,
{
fn from(a: T) -> Self {
let b: &'static [u8] = a.deref(); //error: 'a' does not live long enough.
FileSlice { data: Box::new(b) }
}
}
Deref::deref()
具有签名:
fn deref(&self) -> &Self::Target
或者,减额:
fn deref<'a>(&'a self) -> &'a Self::Target
它借用self
,并返回一个具有相同生存期的引用。因此,如果希望生成的引用为'static
,则需要&self
为&'static self
。T: 'static
不相关:意味着self
是静态的,但&self
是参数a
的地址,显然不是'static
。您需要的是:
impl<T> From<&'static T> for FileSlice
where
T: Deref<Target = [u8]>,
{
fn from(a: &'static T) -> Self {
let b: &'static [u8] = a.deref();
FileSlice { data: Box::new(b) }
}
}