我希望有一个DataAllocator
,可以返回生命周期为'r
的数据,这样我就可以将其传递给something
并仍然能够返回在something
内分配的值:
use std::marker::PhantomData;
pub struct Data<'a, T>{
a: &'a [T]
}
impl<'a, T> Data<'a, T> {
pub fn new() -> Data<'a, T> {
todo!()
}
fn iter(&'a self) -> Iter<'a, T> {
todo!()
}
}
pub struct Iter<'a, T> {
_phantom: PhantomData<&'a T>
}
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
todo!()
}
}
pub trait DataAllocator<'s, 'r, T> {
fn allocate(&'s self) -> Box<dyn AsRef<[T]> + 'r>;
}
impl<'s, 'r, T> DataAllocator<'s, 'r, T> for Data<'r, T> {
fn allocate(&'s self) -> Box<dyn AsRef<[T]> + 'r> {
todo!()
}
}
fn do_something<'a, 'b, T>(data_allocator: &'a dyn DataAllocator<'a, 'b, T>) -> Data<'b, T> {
let buffer = data_allocator.allocate();
let data = Data{a: (*buffer).as_ref()};
for e in data.iter(){}
data
}
error[E0515]: cannot return value referencing local data `*buffer`
--> src/lib.rs:42:5
|
40 | let data = Data{a: (*buffer).as_ref()};
| ------------------ `*buffer` is borrowed here
41 | for e in data.iter(){}
42 | data
| ^^^^ returns a value referencing data owned by the current function
问题在于如果我尝试迭代
data
,它会抱怨我正在尝试返回由 .iter()
函数借用的某些内容。我认为这可能与我说 .iter()
借用了 Data
的生命周期 'b
(分配数据的整个生命周期)有关。在这种情况下,我该怎么办?
Vec
感兴趣,可以考虑使用Cow<'r, [T]>
替代Box<AsRef>
。 - kmdreko