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`之外,这对我的原始代码不起作用,因为struct
    S
    预期寿命比
    'a
    @ChaoSun短,这是不可能的。
    内存工具
    不能返回比自身寿命长的引用,同样,
    S
    也不能返回引用S的内容有些东西的寿命比它自己长,而
    S::pool
    的寿命正好与
    S
    的寿命一样长。我不太确定你想要实现什么。
    impl<'a> S<'a> {
        pub fn write<'b: 'a>(&'b mut self, buffer: &mut ByteArray<'a>) {
            //      ^^^^^^^^  ^^
            ...
        }
    }