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を印刷するにはどうすればよいですか?
パターンマッチングを使用できます。
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
バリアントの1つにのみ一致することに関心があるため、match
の代わりにif let
式を使用できます。
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
にバインドする」ことを意味します。
From The 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 }, } }
異なる表現で複数の型を処理できる関数を記述できるようにしたい場合は、 traits を参照してください。
これを行う別の方法は次のとおりです。
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
バリアントを削除する必要がありました。
複数のバリアントがある場合は、おそらく複数の種類の形状を処理しているため、とにかく完全一致式が必要になる可能性があります。