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 :

[Debutant] Probleme de modification d'une valeur au sein de structures imbriqués


Sujet :

Rust

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2013
    Messages : 3
    Points : 4
    Points
    4
    Par défaut [Debutant] Probleme de modification d'une valeur au sein de structures imbriqués
    Bonjour,
    Dans le cadre de mon apprentissage autonome du RUST, je développe un petit outils de gestion de facture.
    J'essaye de créer et calculer le tableau des TVAs automatiquement, mais cela ne fonctionne pas.
    J'ai essayé plusieurs méthodes et j'ai progressé dans le problème. Cela ne s'additionne pas

    Voici la dernière version de mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        if tvas.len()>0 {
          let mut tmp:&Tva=tvas.iter().filter(|t| t.taux_numerique==d.taux_tva).next().unwrap();  
          let mut ttmp=tmp.clone();    
          ttmp.montant_ht=ttmp.montant_ht+d.montant_ht;
          tmp=&ttmp;
        }else{
          tvas.push(Tva{
            taux: (d.taux_tva*100.0).to_string(),
            taux_numerique: d.taux_tva,
            montant_ht: d.montant_ht,
            montant_tva: 0.0,
            montant_ttc: 0.0,});
        }
    Je suis ouvert à toute proposition ... d'amélioration du code bien sur

  2. #2
    Expert confirmé
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    1 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 1 266
    Points : 5 270
    Points
    5 270
    Par défaut
    Citation Envoyé par tomny Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        if tvas.len()>0 {
          let mut tmp:&Tva=tvas.iter().filter(|t| t.taux_numerique==d.taux_tva).next().unwrap();  
          let mut ttmp=tmp.clone();    
          ttmp.montant_ht=ttmp.montant_ht+d.montant_ht;
          tmp=&ttmp;
        }else{
          tvas.push(Tva{
            taux: (d.taux_tva*100.0).to_string(),
            taux_numerique: d.taux_tva,
            montant_ht: d.montant_ht,
            montant_tva: 0.0,
            montant_ttc: 0.0,});
        }
    Bonjour,

    Je crois que le code que tu essaies d'écrire est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if let Some(tva) = tvas.iter_mut().find(|t| t.taux_numerique == d.taux_tva) {
        tva.montant_ht += d.montant_ht;
    } else {
        tvas.push(Tva{
            taux: (d.taux_tva*100.0).to_string(),
            taux_numerique: d.taux_tva,
            montant_ht: d.montant_ht,
            montant_tva: 0.0,
            montant_ttc: 0.0,
        });
    }
    Remarques :
    • Je présume que tvas est une variable muable de type Vec<Tva>.
    • Je ne sais pas exactement ce que tu as en tête avec tes variables tmp et ttmp, mais il y a probablement plusieurs croyances erronées. Voici ce que fais ton code :
      • tmp est une variable locale qui, au début, contient l'adresse d'un objet de ton vecteur.
      • ttmp est une variable locale qui contient une copie d'un objet de ton vecteur.
      • Tu modifies ttmp.
      • tmp est réaffecté pour pointer vers ttmp. Une telle opération ne modifie pas le vecteur. Elle ne modifie que tmp pour qu'il ne pointe plus vers un élément du vecteur mais vers ailleurs à la place.
      • Au final, le vecteur n'a pas été modifié.

      Ton vecteur possède directement des éléments de type Tva à la suite en mémoire. Ce n'est pas un vecteur d'adresses qu'on peut réaffecter vers d'autres objets de type Tva. Et même si tu avais créé un vecteur d'adresses, Rust t'aurait empêché de réaffecter une de ces adresses à ton objet ttmp dont la durée de vie est plus courte que celle du vecteur. À la place, ce que tu veux faire, c'est modifier directement un élément contenu dans le vecteur.
    • Tu veux modifier un élément de tvas à partir d'une itération, donc il faut utiliser iter_mut, pas iter.
    • tvas.iter_mut().find(|t| t.taux_numerique == d.taux_tva) retourne la même chose que tvas.iter_mut().filter(|t| t.taux_numerique == d.taux_tva).next(). Dans les deux cas, l'expression est de type Option<&mut Tva>. Si un élément correspond au critère de filtre, on a un Some avec une référence vers l'élément à modifier. Sinon, on a un None.
    • Je suis dubitatif sur ton appel à unwrap() dans ton if tvas.len()>0. Dans le code en amont qu'on ne voit pas, es-tu sûr que le fait que le vecteur soit non vide implique qu'il possède un élément qui correspond à ton critère de filtre ?
    • J'ai utilisé un if let, mais tu peux aussi utiliser match à la place si tu es plus à l'aise avec.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2013
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour et merci de ta réponse qui fonctionne très bien
    Je t'avoue que je suis encore un peu perdu avec la notion de temps de vie et de possesseur.
    Venant du .Net et apprenant le langage quand j'ai du temps et j'ai encore du mal à m'éloigner de la façon de penser que j'ai en .Net

    Je vais étudier tout ce que tu m'as écrit pour améliorer ma compréhension et ma façon de coder

    Encore merci à toi

  4. #4
    Expert confirmé
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    1 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 1 266
    Points : 5 270
    Points
    5 270
    Par défaut
    De rien. Bonne continuation dans ton apprentissage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/03/2007, 16h01
  2. Base de registre : Blocage modification d'une valeur
    Par damsmut dans le forum Windows XP
    Réponses: 6
    Dernier message: 26/09/2006, 03h25
  3. [SQL] (PHP/SQL) Erreur de modification d'une valeur
    Par ymoreau dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/09/2006, 15h55
  4. [VB.NET] [XML] Modification d'une valeur
    Par kirk80 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 09/09/2004, 17h15
  5. [Debutant] Probleme d'acces a une variable
    Par Bugmaster dans le forum Langage
    Réponses: 16
    Dernier message: 02/09/2004, 16h57

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