65
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の2番目のプロパティ(ここでは10.0)を出力したいと思います。試しmy_shape.lastてみmy_shape.secondましたが、どちらも機能しませんでした。

この場合、10.0を印刷するにはどうすればよいですか?

4

6 に答える 6

65

バリアントの1つを照合することにのみ関心があるため、 :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、最初のインデックスには何もせず、2番目のインデックスの値をにバインドする」ことを意味しradiusます。

于 2015-11-15T18:54:48.617 に答える
53

パターンマッチングを使用できます。

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
于 2012-02-02T12:40:17.923 に答える
24

これを行う別の方法は次のとおりです。

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

これは、一致する列挙型にバリアントが1つしかない場合など、パターンが反駁できない場合にのみ機能します。これを機能させるには、未使用のRectangleバリアントを削除する必要がありました。

複数のバリアントがある場合は、おそらく複数の種類の形状を処理しているため、とにかく完全一致式が必要になるでしょう。

于 2012-02-06T19:23:40.010 に答える
9

Rustプログラミング言語から:

マッチアームのもう1つの便利な機能は、パターンに一致する値の部分にバインドできることです。これは、列挙型バリアントから値を抽出する方法です。

[...]

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

異なる表現で複数の型を処理できる関数を記述できるようにしたい場合は、特性を確認してください。

于 2012-02-15T13:37:38.697 に答える
4

値を簡単に取得するには、「iflet」を使用できます。

let mut var: f64 = 0.0;
if let Shape::Circle(_, float1) = my_shape {
    var = float1;
}
println!("value is {}", var);
于 2021-05-22T01:34:22.357 に答える
0
let r = match my_shape { Shape::Circle(_, r) => r, _ => 0f64 };

また

let r = if let Shape::Circle(_, r) = my_shape { r } else { 0f64 };
于 2021-04-09T11:25:33.933 に答える