2012-02-02 19 views
10
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); 

サークルの2番目のプロパティである10.0をここで印刷したいと思います。 my_shape.lastmy_shape.secondを試しましたが、いずれもうまくいきませんでした。Rustのenum値にアクセスする

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

は、私はそれを行うには良い方法がありますかどうかわからないんだけど、あなたはパターンマッチングを使用することができますあなたの

答えて

3

ありがとう:

use std; 

type point = {x: float, y: float}; 
enum shape { 
    circle(point, float), 
    rectangle(point, point) 
} 

fn main() { 
    let my_shape = circle({x: 0.0, y: 0.0}, 10.0); 
    alt my_shape { 
     circle(_, value) { 
      std::io::println(#fmt("value: %f", value)); 
     } 
    } 
} 

出力例:

value: 10 
+0

より、@jcollado。 –

+0

ええ、私はまだ良い方法があるべきだと感じています〜: –

+2

あなたの答えを最新のRustの構文に合わせて更新してください。質疑応答は今日の錆にはまだ関連しています。 –

2

ここでは、別の方法:

use std; 

type point = {x: float, y: float}; 
enum shape { 
    circle(point, float), 
} 

fn main() { 
    let circle(_, radius) = circle({x: 0.0, y: 0.0}, 10.0); 
    std::io::println(#fmt("value: %f", radius)); 
} 

これは、letパターンが反駁可能でない場合にのみ機能します。たとえば、一致する列挙型に1つのバリアントしかない場合などです。この作業を行うには、未使用のrectangleを削除する必要がありました。

複数のバリアントがある場合、おそらく1種類以上の形状を処理している可能性があるため、おそらく完全なalt式が必要になります。

+2

現在のRustの構文と一致するように回答を更新してください。質疑応答は今日の錆にはまだ関連しています。 –

6

錆のチュートリアル(強調は筆者)から:複数のバリアントを持つ列挙型の場合

な破壊は、その内容で取得する唯一の方法 です。あなたは複数のタイプで作業することができる機能を書くことができるようにしたい場合は

fn area(sh: shape) -> float { 
    alt sh { 
     circle(_, size) { float::consts::pi * size * size } 
     rectangle({x, y}, {x: x2, y: y2}) { (x2 - x) * (y2 - y) } 
    } 
} 

http://doc.rust-lang.org/doc/tutorial.html#enum-patterns

:すべてのバリアントのコンストラクタは、地域のこの定義のように パターンとして使用することができますあなたはmatchinにのみ関心があるとして

http://doc.rust-lang.org/doc/tutorial.html#interfaces

+2

現在のRustの構文に合わせて回答を更新してください。質疑応答は今日の錆にはまだ関連しています。 –

11

:異なる表現で、インターフェースを見てグラム変種の一つ、あなたが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_shapeCircleに非構造できるのであれば、最初のインデックスと何もしないが、radiusに第2の指標の値をバインドする」という意味します。

関連する問題