当我遇到错误时,我正在try 打印一些数据以进行调试.你可以看看full code here号.
当我试图打印从prepare_hash_data()
函数返回的数据时出错,该函数返回Vec<u8>
.
let data = self.prepare_hash_data()?; // returns Vec<u8>
println!("{}", String::from_utf8(data)?); // error here
let mut hasher = Sha256::new();
hasher.input(&data[..]);
println!("{}", hasher.result_str().as_str());
self.hash = hasher.result_str();
下面给出了prepare_hash_data()
函数.其他细节将被省略.简单地说,它只是一个返回Vec<u8>
的函数
fn prepare_hash_data(&self) -> Result<Vec<u8>, failure::Error> {
let content = (
self.hash_prev_block.clone(),
self.transactions.clone(),
self.timestamp,
DIFFICULTY,
self.nonce
);
let bytes = bincode::serialize(&content)?;
Ok(bytes)
}
给出的错误是
error[E0382]: borrow of moved value: `data`
--> src/block.rs:63:23
|
60 | let data = self.prepare_hash_data()?;
| ---- move occurs because `data` has type `Vec<u8>`, which does not implement the `Copy` trait
61 | println!("{}", String::from_utf8(data)?);
| ---- value moved here
62 | let mut hasher = Sha256::new();
63 | hasher.input(&data[..]);
| ^^^^ value borrowed here after move
我try 了以下几种方法
-
实施
Copy
trait .但是,Vec<u8>
不能拥有所描述的here的Copy
特征. -
查看错误消息中给出的E0382,建议使用两种方法.
-
使用
reference
,我们可以让另一个函数borrow 该值,而无需更改其所有权.- 但在本例中,我应该如何使用
reference
呢? - 我是否应该将函数签名更改为类似于此的
fn prepare_hash_data(&self) -> Result<&Vec<u8>, failure::Error>
?
- 但在本例中,我应该如何使用
-
值为
Rc
时,一个值不能由多个变量拥有.- 不知道如何实施.
-
-
我试着在
println!("{}", String::from_utf8(data.clone())?);
岁之前克隆数据- 但是,它给出了另一个错误
backtrace::backtrace::trace_unsynchronized
- 有关完整的错误日志(log),请单击here
- 但是,它给出了另一个错误
打印一些没有moving
就不可能是copied
或cloned
的数据以供后续行使用,正确的方法应该是什么?
我确实研究了以下解决方案,但无法联系到答案.