Rust 方法,该方法变异'self'并使用'struct'字段之一(错误:移到可变引用后面)

Rust 方法,该方法变异'self'并使用'struct'字段之一(错误:移到可变引用后面),rust,move-semantics,Rust,Move Semantics,我试图在一个文件上构建一个抽象,其中内容存储在内存中,并在将其写入文件系统之前计算哈希值,这应该在close()方法中进行 使用std::path::PathBuf; 使用sha2::{摘要,Sha256}; fn main(){ 让mut fwh=FileWithHash::new(PathBuf::from(“somepath.txt”); fwh.write(“第一行”\n); fwh.write(“第二行\n”); fwh.close(); } 结构FileWithHash{ 路径:Pa

我试图在一个文件上构建一个抽象,其中内容存储在内存中,并在将其写入文件系统之前计算哈希值,这应该在
close()
方法中进行

使用std::path::PathBuf;
使用sha2::{摘要,Sha256};
fn main(){
让mut fwh=FileWithHash::new(PathBuf::from(“somepath.txt”);
fwh.write(“第一行”\n);
fwh.write(“第二行\n”);
fwh.close();
}
结构FileWithHash{
路径:PathBuf,
哈希:选项,
内容:Vec,
酒吧播客:Sha256,
}
impl FileWithHash{
pub fn new(路径:PathBuf)->FileWithHash{
FileWithHash{
路径
哈什:没有,
内容:Vec::new(),
hasher:Sha256::new(),
}
}
发布fn写入(&mut self,内容:&str){
self.hasher.update(content.as_bytes());
self.content.push(content.to_string());
}
发布fn关闭(&mut self){
//计算最后的散列
//签名:fn finalize(自)->输出;
//它消耗自我
//错误:无法移出可变引用后面的'self.hasher'
self.hash=Some(格式!(“{:x}”,self.hasher.finalize());
//将文件写入路径
// ...
}
}
我遇到的问题是
self.hasher.finalize()
方法使用
hasher
,它是
self
的一部分,它本身就是
&mut
。我想我理解为什么这不起作用,但我不能想出一个合理的解决办法

我试着将逻辑提取到一个函数中,比如

pub fn compute\u hash(hasher:Sha256)->String{
格式!(“{:x}”,hasher.finalize())
}
但随后我遇到了部分移动值的问题(有意义)

你知道这里应该是什么样的模式吗

谢谢你的帮助


@justinas,我试过
选项
建议

这些方法变得

pub-fn-write(&mut-self,内容:字符串){
match&mut self.hasher{
Some(h)=>h.update(content.as_bytes()),
无=>{}
}
self.size=self.size+content.len();
self.content.push(内容);
}
发布fn关闭(&mut self){
self.hash=Some(格式!(“{:x}”,self.hasher.take().unwrap().finalize());
//将文件写入路径
// ...
}

你觉得这样行吗?

这能回答你的问题吗?重复项的应用:要么
replace()
Sha256
的新实例替换哈希器,要么改为使用字段
选项和哈希器,保留一个
None
。调用
close()
后,
FileWithHash
是否仍然可用?如果没有,您可以更改
close()
的签名,以便它需要
mut self
。这样,move将不再位于可变引用和。