58 votes

Comment accéder aux valeurs enum dans Rust ?

struct Point {
    x: f64,
    y: f64,
}

enum Shape {
    Circle(Point, f64),
    Rectangle(Point, Point),
}

let my_shape = Shape::Circle(Point { x: 0.0, y: 0.0 }, 10.0);

Je veux imprimer la circle , qui est 10.0 ici. J'ai essayé my_shape.last et my_shape.second , mais aucun n'a fonctionné.

Que dois-je faire pour imprimer 10.0 dans ce cas ?

47voto

jcollado Points 18325

Vous pouvez utiliser la correspondance de modèle :

 struct Point {
    x: f64,
    y: f64,
}

enum Shape {
    Circle(Point, f64),
    Rectangle(Point, Point),
}

fn main() {
    let my_shape = Shape::Circle(Point { x: 0.0, y: 0.0 }, 10.0);

    match my_shape {
        Shape::Circle(_, value) => println!("value: {}", value),
        _ => println!("Something else"),
    }
}

Exemple de sortie :

 value: 10

22voto

Eric Holk Points 599

Voici une autre façon de procéder :

 struct Point {
    x: f64,
    y: f64,
}

enum Shape {
    Circle(Point, f64),
}

fn main() {
    let Shape::Circle(_, radius) = Shape::Circle(Point { x: 0.0, y: 0.0 }, 10.0);
    println!("value: {}", radius);
}

Cela ne fonctionne que si le modèle est irréfutable, par exemple lorsque le type d'énumération sur lequel vous faites correspondre n'a qu'une seule variante. Pour que cela fonctionne, j'ai dû supprimer la variante Rectangle

Dans les cas où vous avez plus d'une variante, vous voudrez probablement l'expression de correspondance complète de toute façon, puisque vous manipulez vraisemblablement plus d'un type de forme.

2voto

Samuel Kim Points 11

Pour une simple récupération de valeur, vous pouvez utiliser "if let"

 let mut var: f64 = 0.0;
if let Shape::Circle(_, float1) = my_shape {
    var = float1;
}
println!("value is {}", var);

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