3 votes

Stockage vectoriel de types de données mixtes en Rust

Dans le contexte de la conversion d'une expression infixe en expression postfixe, en utilisant l'algorithme Shunting-yard. Je veux utiliser un vecteur pour stocker la sortie, qui stockerait à la fois les données de type opérateur et numérique.

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Operator {
    Add,
    Sub,
    Mul,
    Div,
}

fn main() {
    let mut output: Vec<String> = Vec::new();  // create an output vector
    let a = 2;
    let b = Operator::Add;
    let c = 3;
    output.push(a.to_string());
    output.push(b.to_string());
    output.push(c.to_string());
}

Bien entendu, le code ci-dessus ne compile pas, puisque le paramètre to_string() n'est pas définie pour la méthode Operator . Je vois deux façons de régler ce problème :

  1. Définir un to_string() méthode
  2. Créer un vecteur pour stocker des références à des nombres et Operator .

Je pense que le second choix est préférable, bien que je ne sache pas si la création d'un vecteur de références introduira beaucoup de complexité.

7voto

Chris Emerson Points 8179

Il n'est pas nécessaire d'utiliser des références ; il suffit de stocker les numéros et Operator directement dans un enum :

enum Thing {
    Op(Operator),
    Number(i32),
}

fn main() {
    let mut output: Vec<Thing> = Vec::new();
    let a = 2;
    let b = Operator::Add;
    let c = 3;
    output.push(Thing::Number(a));
    output.push(Thing::Op(b));
    output.push(Thing::Number(c));
}

Et puis match sur eux quand vous les sortez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X