如何在Rust中访问枚举值?

时间:2012-02-02 09:28:14

标签: 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);

我想打印circle的第二个属性,这里是10.0。 我尝试了my_shape.lastmy_shape.second,但都没有效果。

在这种情况下,为了打印10.0,我该怎么做?

6 个答案:

答案 0 :(得分:19)

由于您只对匹配其中一个变体感兴趣,因此您可以使用diamond_plots表达式而不是results = "asis"

if let

这意味着“如果match可以解构为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); if let Shape::Circle(_, radius) = my_shape { println!("value: {}", radius); } } ,则不对第一个索引执行任何操作,而是将第二个索引的值绑定到my_shape”。

答案 1 :(得分:9)

您可以使用模式匹配:

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"),
    }
}

示例输出:

value: 10

答案 2 :(得分:7)

来自The Rust Programming Language

  

匹配臂的另一个有用功能是它们可以绑定到与模式匹配的值的部分。这就是我们如何从枚举变体中提取值。

     

[...]

fn value_in_cents(coin: Coin) -> u32 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        },
    }
}

如果您希望能够编写能够处理具有不同表示形式的多种类型的函数,请查看traits

答案 3 :(得分:3)

这是另一种方法:

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);
}

这仅在模式无法反复时才有效,例如当您匹配的枚举类型只有一个变体时。为了完成这项工作,我必须删除未使用的Rectangle变体。

如果你有多个变种,你可能还是想要完整的匹配表达,因为你可能只处理一种形状。

答案 4 :(得分:2)

为了简单的取值,可以使用“if let”

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

答案 5 :(得分:0)

let r = match my_shape { Shape::Circle(_, r) => r, _ => 0f64 };

let r = if let Shape::Circle(_, r) = my_shape { r } else { 0f64 };