Как вы получаете доступ к значениям перечисления в Rust? - PullRequest
19 голосов
/ 02 февраля 2012
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.last и my_shape.second, но ни один из них не работал.

Что я должен сделать, чтобы распечатать 10.0 в этом случае?

Ответы [ 4 ]

20 голосов
/ 15 ноября 2015

Поскольку вас интересует только сопоставление одного из вариантов, вы можете использовать выражение 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».

9 голосов
/ 02 февраля 2012

Вы можете использовать сопоставление с образцом:

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
7 голосов
/ 15 февраля 2012

С Язык программирования 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 .

4 голосов
/ 06 февраля 2012

Вот еще один способ сделать это:

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.

В тех случаях, когда у вас есть более одного варианта, вам, вероятно, все равно понадобится выражение полного соответствия, поскольку вы, вероятно, обрабатываете не только один вид формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...