首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rust中结构字段值之间的依赖关系

Rust中结构字段值之间的依赖关系
EN

Stack Overflow用户
提问于 2022-07-13 00:08:33
回答 1查看 50关注 0票数 0

我有以下铁锈结构:

代码语言:javascript
复制
struct Binary<'a> {
    path: PathBuf,
    bytes: Vec<u8>,
    pe: PE<'a>,
}

impl<'a> Binary<'a> {
    fn read(p: PathBuf) -> Binary<'a> {
        todo!();
    }
}

这里PE来自格布林箱

我尝试了一些实现read函数的方法,但是我很难解决bytes字段与引用这些字节的PE之间的依赖关系:

例如:

代码语言:javascript
复制
fn new(p: PathBuf) -> Binary<'a> {
        if let Ok(bytes) = std::fs::read(&p) {
            Binary {
                path: p,
                bytes: bytes,
                pe: PE::parse(&bytes).unwrap()
            }
        } else {
            panic!()
        }
}

显然,这不起作用,bytes是在移动到bytes: bytes行后借用的。我看不到从字节字段的移动值初始化PE字段的方法。

目前,我通过不将PE存储在Binary结构中来解决这个问题,并简单地创建了一个函数,在需要时从字节返回PE:

代码语言:javascript
复制
    fn pe(&self) -> Option<PE> {
        match PE::parse(&self.bytes) {
            Ok(p) => Some(p),
            Err(_) => None,
        }
    }

但是我很想知道我缺少的是什么,以及如何只解析文件一次。

EN

回答 1

Stack Overflow用户

发布于 2022-07-13 02:03:05

一个选项是在read函数之外定义字节,这是因为字节的生存期大于binary结构的生存期。

代码语言:javascript
复制
struct Binary<'a> {
    path: PathBuf,
    bytes: Vec<u8>,
    pe: PE<'a>,
}

impl<'a> Binary<'a> {
    fn read(bytes: &'a [u8], path: PathBuf) -> Result<Self, Box<dyn std::error::Error>> {
        let pe = PE::parse(bytes)?;
        Ok(Self {
            path,
            bytes: bytes.to_vec(),
            pe,
        })
    }
}

fn main() {
    let path = PathBuf::from("my path");
    let bytes = std::fs::read(&path).unwrap();
    let binary = Binary::read(&bytes, path);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72959557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档