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

Tôi muốn in thuộc tính thứ hai của vòng kết nối, là 10,0 tại đây. Tôi đã thử my_shape.lastmy_shape.second nhưng không hoạt động.Truy cập các giá trị enum trong Rust

Tôi nên làm gì để in ra 10,0 trong trường hợp này?

Cảm ơn bạn

Trả lời

3

Tôi không chắc chắn nếu có một cách tốt hơn để làm điều đó, nhưng bạn có thể sử dụng mô hình phù hợp:

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

Ví dụ đầu ra:

value: 10 
+0

thans, @jcollado. –

+0

Vâng, tôi vẫn cảm thấy có cách nào tốt hơn ~ :) –

+2

hãy cập nhật câu trả lời của bạn để khớp với cú pháp hiện tại của Rust. Câu hỏi và câu trả lời vẫn có liên quan đến Rust ngày nay. –

2

Đây là một cách khác để thực hiện:

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

Điều này chỉ hoạt động nếu mẫu cho phép là không thể chối cãi, ví dụ: nếu loại enum bạn khớp trên chỉ có một biến thể. Để thực hiện công việc này, tôi phải xóa biến thể chưa sử dụng rectangle.

Trong trường hợp bạn có nhiều hơn một biến thể, có thể bạn sẽ muốn biểu thức alt đầy đủ, vì bạn có lẽ đang xử lý nhiều hơn một loại hình dạng.

+2

vui lòng cập nhật câu trả lời của bạn để khớp với cú pháp hiện tại của Rust. Câu hỏi và câu trả lời vẫn có liên quan đến Rust ngày nay. –

6

Từ hướng dẫn Rust (nhấn mạnh thêm):

Đối với các loại enum với nhiều biến thể, destructuring là cách duy nhất để có được tại nội dung của họ. Tất cả các nhà xây dựng biến thể có thể được sử dụng như mẫu, như trong định nghĩa này của khu vực:

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

Nếu bạn muốn để có thể viết các chức năng có khả năng làm việc trên nhiều loại với cơ quan đại diện khác nhau, có một cái nhìn tại các giao diện:

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

+2

vui lòng cập nhật câu trả lời của bạn để khớp với cú pháp hiện tại của Rust. Câu hỏi và câu trả lời vẫn có liên quan đến Rust ngày nay. –

11

Như bạn chỉ quan tâm đến matchin g một trong những biến thể, bạn có thể sử dụng một biểu thức 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); 
    } 
} 

này có nghĩa là "nếu my_shape có thể được destructured thành một Circle, không phải làm gì với chỉ số đầu tiên, nhưng ràng buộc giá trị của chỉ số thứ hai để radius" .

Các vấn đề liên quan