如何在Rust中访问枚举值?

xam8gpfp  于 2023-04-30  发布在  其他
关注(0)|答案(7)|浏览(156)
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在这种情况下?

qyyhg6bp

qyyhg6bp1#

由于您只对匹配其中一个变量感兴趣,因此可以使用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可以被解构为Circle,则不对第一个索引做任何事情,而是将第二个索引的值绑定到radius”。

mec1mxoz

mec1mxoz2#

您可以使用模式匹配:

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
3qpi33ja

3qpi33ja3#

下面是另一种方法:

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变体。
在有多个变量的情况下,无论如何都可能需要完整的匹配表达式,因为您可能要处理不止一种形状。

vawmfj5a

vawmfj5a4#

Rust Programming Language(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
        },
    }
}

如果你想编写能够处理不同类型的函数,可以看看traits

xdnvmnnf

xdnvmnnf5#

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

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

s8vozzvw6#

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

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

kh212irz7#

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

相关问题