2012-02-02 55 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); 

Chcę wydrukować drugą właściwość koła, która wynosi 10.0 tutaj. Próbowałem my_shape.last i my_shape.second, ale nie działało.Uzyskaj wartości wyliczeniowe w Rust

Co należy zrobić, aby wydrukować 10.0 w tym przypadku?

Dziękuję

Odpowiedz

3

Nie jestem pewien, czy istnieje lepszy sposób to zrobić, ale można użyć dopasowywania wzoru:

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

Przykâadowa:

value: 10 
+0

thans, @jcollado. –

+0

Tak, nadal uważam, że powinna być lepsza droga ~ :) –

+2

proszę zaktualizować swoją odpowiedź, aby pasowała do obecnej składowej Rusta. Pytanie i odpowiedź są nadal aktualne w przypadku dzisiejszej rdzy. –

2

Oto inny sposób to zrobić:

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

Działa to tylko wtedy, gdy wzór let jest niezastąpiony, na przykład, jeśli typ wyliczeniowy, który pasujesz, ma tylko jeden wariant. Aby to zadziałało, musiałem usunąć nieużywany wariant rectangle.

W przypadku, gdy masz więcej niż jeden wariant, prawdopodobnie będziesz potrzebować wyrażenia pełnego alt, ponieważ prawdopodobnie zajmujesz się czymś więcej niż tylko jednym rodzajem kształtu.

+2

proszę zaktualizować swoją odpowiedź, aby pasowała do obecnej składowej Rusta. Pytanie i odpowiedź są nadal aktualne w przypadku dzisiejszej rdzy. –

6

z samouczka Rust (podkreślenie dodane):

Dla typów enum z wieloma wariantami, rozpad jest jedynym sposobem, aby dostać się na ich zawartości. Wszystkie konstruktorzy wariant może być stosowany jako wzory, jak w tej definicji obszaru:

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

Jeśli chcesz, aby móc napisać funkcje, które są w stanie pracować na wielu typach z różnymi reprezentacjami, spojrzeć interfejsów:

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

+2

proszę zaktualizować swoją odpowiedź, aby pasowała do obecnej składowej Rusta. Pytanie i odpowiedź są nadal aktualne w przypadku dzisiejszej rdzy. –

11

Jak jesteś zainteresowany tylko w matchin g jeden z wariantów, można użyć if let wyrażenie:

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

Oznacza to „jeśli my_shape można destrukturyzowaną do Circle, nic nie robić z pierwszym indeksem, ale wiążą się z wartości drugiego wskaźnika do radius” .