Rust 关于锈蚀寿命的问题
我正试图实现一个基于Rust 关于锈蚀寿命的问题,rust,lifetime,Rust,Lifetime,我正试图实现一个基于TypedArena的内存池。以下是我的原始代码的简化版本: #![feature(rustc_private)] extern crate arena; use arena::TypedArena; pub struct MemoryPool { arena: TypedArena<Vec<u8>>, bytes_allocated: usize, } impl MemoryPool { pub fn consume(&a
TypedArena
的内存池。以下是我的原始代码的简化版本:
#![feature(rustc_private)]
extern crate arena;
use arena::TypedArena;
pub struct MemoryPool {
arena: TypedArena<Vec<u8>>,
bytes_allocated: usize,
}
impl MemoryPool {
pub fn consume(&mut self, buf: Vec<u8>) -> &[u8] {
self.bytes_allocated += buf.capacity();
self.arena.alloc(buf)
}
}
pub struct ByteArray<'a> {
data: &'a [u8],
}
impl<'a> ByteArray<'a> {
pub fn set_data(&mut self, data: &'a [u8]) {
self.data = data;
}
}
pub struct S<'a> {
pool: &'a mut MemoryPool,
}
impl<'a> S<'a> {
pub fn write(&mut self, buffer: &mut ByteArray<'a>) {
let v = vec!();
let data = self.pool.consume(v);
buffer.set_data(data);
}
}
我的问题是:
数据
没有生存期'a
?我认为既然池
有生存期a
,消费
返回与自身
相同的生存期,那么它应该有生存期'a
TypedArena
,因为alloc
不接受mut
引用。但是,我确实希望跟踪其他信息,例如分配的字节数
让我们一步一步地解决这个问题:
无法推断自动引用的适当生存期
“autoref”描述了为方法的self
参数构建正确引用的过程。编译器找不到具有正确生存期的引用来调用consume()
。为什么不能呢
注意:首先,生命周期不能超过身体上32:54定义的匿名生命周期#1。。。
--> :32:55
|
32 |发布fn写入(&mut-self,buffer:&mut-ByteArray-SThanks。我想我的困惑是,self.pool
的生命周期是self
,而不是pool
,pool
是可变的。这不是直观的,因为pool附带了一个生命周期注释'a
。要修复代码,你还有其他建议吗?)除了为self
添加一个'b`之外,这对我的原始代码不起作用,因为structS
预期寿命比'a
@ChaoSun短,这是不可能的。内存工具
不能返回比自身寿命长的引用,同样,S
也不能返回引用S的内容有些东西的寿命比它自己长,而S::pool
的寿命正好与S
的寿命一样长。我不太确定你想要实现什么。
impl<'a> S<'a> {
pub fn write<'b: 'a>(&'b mut self, buffer: &mut ByteArray<'a>) {
// ^^^^^^^^ ^^
...
}
}