Bonjour,
Je me forme actuellement en language Rust et dans ce cadre, j'aurais une question.
Voici mon code :
block.rs :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| mod data;
use sha2::{Sha256, Digest};
pub struct Block {
hash: [u8; 32],
timestamp: i64,
prev_hash: Option<[u8; 32]>,
data: Vec<Box<dyn data::Data>>,
}
impl Block {
fn generate_hash(pBlock: &Block) -> [u8; 32] {
let mut hasher = Sha256::new();
let mut res: Vec<u8> = Vec::<u8>::new();
res.extend(pBlock.timestamp.to_be_bytes());
match pBlock.prev_hash {
Some(a) => {
res.extend(a);
}
None => {
res.extend([0_u8; 32]);
}
};
for d in pBlock.data {
res.extend(d.serialize());
}
hasher.update(&res[..]);
return hasher.finalize().as_slice().try_into().expect("Wrong length");
}
} |
data.rs :
1 2 3
| pub trait Data {
fn serialize(&self) -> Vec<u8>;
} |
J'ai une structure de type Block que je passe argument par référence à ma fonction generate_hash. Cette référence est non modifiable.
J'aimerais ensuite appelé la fonction serialize du champ "data" de ma structure.
Cela me génère l'erreur suivante :
error[E0507]: cannot move out of `pBlock.data` which is behind a shared reference
--> src/block.rs:27:14
|
27 | for d in pBlock.data {
| ^^^^^^^^^^^
| |
| `pBlock.data` moved due to this implicit call to `.into_iter()`
| move occurs because `pBlock.data` has type `Vec<Box<dyn Data>>`, which does not implement the `Copy` trait
On me dit d'implémenter copy mais j'aimerais éviter de l'implémenter.
Je ne compte pas modifier mes données dans le champ data, et je trouve dommage de devoir implémenter la fonction copy car je voudrais uniquement lire sans devoir faire une copie de données.
Il doit y avoir une notion qui m'échappe, quelqu'un pourrait il m'éclairer ?
Partager