如何在Rust中访问枚举值?

And*_*ind 25 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);
Run Code Online (Sandbox Code Playgroud)

我想打印出circle第二个属性,这里是10.0.我试过my_shape.lastmy_shape.second,但既不工作.

在这种情况下,我该怎么办才能打印10.0?

Tob*_*oby 24

由于您只对匹配其中一个变体感兴趣,因此可以使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着"如果my_shape可以将其解析为a Circle,则不对第一个索引执行任何操作,而是将第二个索引的值绑定到radius".


jco*_*ado 17

您可以使用模式匹配:

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"),
    }
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

value: 10
Run Code Online (Sandbox Code Playgroud)


小智 7

这是另一种方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

这仅在模式不可辩驳的情况下才有效,例如当您要匹配的枚举类型只有一个变体时。为了使这项工作有效,我必须删除未使用的Rectangle变体。

如果您有多个变体,您可能还是想要完全匹配的表达式,因为您可能要处理的不仅仅是一种形状。


B. *_*gel 7

来自Rust编程语言:

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

[...]

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
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 6

对于简单的值检索,您可以使用“if let”

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


小智 5

let r = match my_shape { Shape::Circle(_, r) => r, _ => 0f64 };
Run Code Online (Sandbox Code Playgroud)

或者

let r = if let Shape::Circle(_, r) = my_shape { r } else { 0f64 };
Run Code Online (Sandbox Code Playgroud)


caf*_*e25 5

Rust 1.65.0 为我们带来了 let-else,它允许您以比 match 或 if-let 更少的嵌套以新方式访问单个枚举变体:

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

    let Shape::Circle(_, radius) = my_shape else { return; };
    println!("value: {radius}");
}

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

enum Shape {
    Circle(Point, f64),
    Rectangle(Point, Point),
}
Run Code Online (Sandbox Code Playgroud)

elsea 的分支必须let else是发散的,这意味着它必须执行以下任一操作:

  • 发散关键字return, continue,break
  • 无限的loop
  • Apanic!
  • !一个返回never 类型的函数

或任何其他有分歧的陈述