< 返回版块

林深好材 发表于 2024-04-28 09:58

Tags:生命周期

原始数据接口 value 中的内容根据某种约定规则,可以划分为若段节

pub struct Record {

value: Bytes,

}

impl Record {

pub fn new(value: Bytes) -> Self {
    Self { value, }
}

pub fn get_section(&self, index: u16) -> Option<&[u8]> {
    // 这里分节,并且返回节序为指定值index的节的内容
}

}

由于对同一个Record,get_section 会重复的执行很多很多此,因此想缓存节划分的过程,如是修改结构如下

pub struct Record<'b, 'a: 'b> {

value: &'a Bytes,
 
section_buffer: HashMap<u16, &'b [u8]>,

}

问:以上的声名周期申明正确合理的么?对应的实现因该怎么申明声名周期?

评论区

写评论
bestgopher 2024-04-28 14:58
use bytes::Bytes;
use std::collections::HashMap;

pub struct Record<'b, 'a:'b> {
    value: &'a Bytes,
    section_buffer: HashMap<u16, &'b [u8]>,
}

impl<'b, 'a> Record<'b, 'a> {
    pub fn new(value: &'a Bytes) -> Self {
        Self {
            value,
            section_buffer: HashMap::new(),
        }
    }

    pub fn get_section(&mut self, index: u16) -> Option<&'b [u8]> {
        if let Some(x) = self.section_buffer.get(&index) {
            return Some(x);
        }

        let mut x = &self.value[1..2];
        self.section_buffer.insert(index, x);
        Some(x)
    }
}

fn main() {}

--
👇
林深好材: 谢谢回复,就本次的需求来说,运行起来是OK的。 如果一定要强调缓存的声名周期比值的生命周期短呢?

--
👇
bestgopher:

use bytes::Bytes;
use std::collections::HashMap;

pub struct Record<'a> {
    value: &'a Bytes,
    section_buffer: HashMap<u16, &'a [u8]>,
}

impl<'a> Record<'a> {
    pub fn new(value: &'a Bytes) -> Self {
        Self {
            value,
            section_buffer: HashMap::new(),
        }
    }

    pub fn get_section(&mut self, index: u16) -> Option<&[u8]> {
        if let Some(x) = self.section_buffer.get(&index) {
            return Some(x);
        }

        let mut x = &self.value[1..2];
        self.section_buffer.insert(index, x);
        Some(x)
    }
}

fn main() {}

这样可以吗

作者 林深好材 2024-04-28 10:34

谢谢回复,就本次的需求来说,运行起来是OK的。 如果一定要强调缓存的声名周期比值的生命周期短呢?

--
👇
bestgopher:

use bytes::Bytes;
use std::collections::HashMap;

pub struct Record<'a> {
    value: &'a Bytes,
    section_buffer: HashMap<u16, &'a [u8]>,
}

impl<'a> Record<'a> {
    pub fn new(value: &'a Bytes) -> Self {
        Self {
            value,
            section_buffer: HashMap::new(),
        }
    }

    pub fn get_section(&mut self, index: u16) -> Option<&[u8]> {
        if let Some(x) = self.section_buffer.get(&index) {
            return Some(x);
        }

        let mut x = &self.value[1..2];
        self.section_buffer.insert(index, x);
        Some(x)
    }
}

fn main() {}

这样可以吗

bestgopher 2024-04-28 10:06
use bytes::Bytes;
use std::collections::HashMap;

pub struct Record<'a> {
    value: &'a Bytes,
    section_buffer: HashMap<u16, &'a [u8]>,
}

impl<'a> Record<'a> {
    pub fn new(value: &'a Bytes) -> Self {
        Self {
            value,
            section_buffer: HashMap::new(),
        }
    }

    pub fn get_section(&mut self, index: u16) -> Option<&[u8]> {
        if let Some(x) = self.section_buffer.get(&index) {
            return Some(x);
        }

        let mut x = &self.value[1..2];
        self.section_buffer.insert(index, x);
        Some(x)
    }
}

fn main() {}

这样可以吗

1 共 3 条评论, 1 页