2013-06-09 40 views
5

Tôi muốn người dùng chuyển các đối số dòng lệnh đến một hàm đơn giản mà tôi đã viết trong Rust. Tôi biết rằng tôi có thể sử dụng int::from_str(args[1]) để chuyển đổi, nhưng điều này trả về một Option<int>, có nghĩa là để chuyển nó vào một hàm mất int, như dưới đây, tôi phải sử dụng câu lệnh match. Nhưng với các đối số n, có 2^n khả năng. Viết một loạt các câu lệnh lồng nhau match với một cái gì đó sẽ là khủng khiếp. Sẽ rất lý tưởng nếu có cách để làm điều gì đó như:Kiểm tra loại Rust enum bằng boolean?

// will return either Some(int) or None 
let start = int::from_str(args[1]), end = int::from_str(args[2]); 
if typeof(start) == Some && typeof(end) == Some { 
    println(fmt!("You entered: %d, %d", start, end); 
} else { 
    println("Error with arguments."); 
} 

Có phương pháp nào như vậy không? Điều đó cho phép tôi kiểm tra thành viên của một cái gì đó enum là bên cạnh match?

Trả lời

6

Các biến thể của một enum là tất cả cùng loại (trong trường hợp này, cả hai NoneSome(foo)Option<int>), vì vậy những gì bạn thực sự muốn làm là kiểm tra mà biến startend đang có. May mắn thay Rust cung cấp một số tùy chọn.

Bản dịch trực tiếp mã của bạn sẽ là sử dụng start.is_some() && end.is_some(). Tuy nhiên, điều này yêu cầu sửa đổi chuỗi định dạng thành fmt!("You entered: %d, %d", start.get(), end.get()), bởi vì startend không phải là số nguyên, nhưng vẫn được bao bọc trong biến thể Some(...). (Biến thể này là một cái gì đó phải được viết trên cơ sở từng ngụ ý, không có hàm dựng sẵn nào cho phép bạn thực hiện phép thử cho bất kỳ enum nào.)

Cách thành ngữ sẽ giống như thế này :

// will return either Some(int) or None 
let start_opt = int::from_str(args[1]), end_opt = int::from_str(args[2]); 
match (start_opt, end_opt) { 
    // only matches if both are Some 
    (Some(start), Some(end)) => println(fmt!("You entered: %d, %d", start, end), 

    // will match when either (or both) are None 
    _      => println("Error with arguments."); 
} 
+0

Ah, tôi không biết bạn có thể thực hiện nhiều đối số trong một trận đấu. Thật tuyệt. Tôi lấy nó, sau đó, rằng phương pháp 'is_some()', và giống như nó, sẽ cần phải được viết rõ ràng cho bất kỳ loại nào ra khỏi đó? –

+0

@ limp_chimp, đúng, có '.is_some()' được định nghĩa trên 'Tùy chọn' trong thư viện chuẩn; nhưng nếu bạn định nghĩa enums của riêng mình, sẽ không có phương pháp tự động như thế. – huon

+1

@limp_chimp: và thực sự nếu bạn nhìn vào việc thực hiện 'is_some', đó là'! Self.is_none() ', là' match * self {None => true, Some (_) => false} '. (Nhưng lo sợ không cho một hit hoàn hảo cho các cuộc gọi phương thức bổ sung, tất cả đều được đánh dấu '# [inline]'.) –

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