我有以下铁锈结构:
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之间的依赖关系:
例如:
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:
fn pe(&self) -> Option<PE> {
match PE::parse(&self.bytes) {
Ok(p) => Some(p),
Err(_) => None,
}
}但是我很想知道我缺少的是什么,以及如何只解析文件一次。
发布于 2022-07-13 02:03:05
一个选项是在read函数之外定义字节,这是因为字节的生存期大于binary结构的生存期。
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);
}https://stackoverflow.com/questions/72959557
复制相似问题