IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Rust Discussion :

Méthodes constantes dans des traits


Sujet :

Rust

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 35
    Par défaut Méthodes constantes dans des traits
    Bonjour,

    Je me forme actuellement en language Rust et dans ce cadre, j'aurais une question.

    Voici mon code :

    block.rs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Le souci est que l’itérateur créé automatiquement par ta boucle for (via le trait IntoIterator) va consommer le vecteur.
    Extrait de la doc de Vec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    impl<'a, T> IntoIterator for &'a mut Vec<T>
    	into_iter 	Creates an iterator from a value.
    Par contre si tu utilise une référence au vecteur dans ton for, il est créé un itérateur qui retournera des références sans consommer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    impl<T> IntoIterator for Vec<T>
    	into_iter 	Creates a consuming iterator, that is, one that moves each value out of the vector (from start to end).
    Donc le code suivant devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        for d in &pBlock.data {
          res.extend(d.serialize());
        }

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/07/2016, 17h02
  2. Méthode clone() dans des classes qui s'étendent
    Par xenos dans le forum Langage
    Réponses: 8
    Dernier message: 13/01/2012, 14h23
  3. Utilisation de constantes dans des requetes SQL sous access
    Par wiyouk dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/08/2010, 06h58
  4. A propos des méthodes constantes
    Par Sahara dans le forum C++
    Réponses: 4
    Dernier message: 05/01/2007, 00h43
  5. Réponses: 1
    Dernier message: 10/05/2006, 19h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo