2015-06-23 14 views
10

Thật là một lỗi lạ:Kết quả không có phương thức gọi là "unwrap()"?

use std::collections::BTreeMap; 

struct MyStruct1; 
struct Error; 

fn get_res() -> Result<(MyStruct1, BTreeMap<String, String>), Error> { 
    Err(Error) 
} 

fn main() { 
    let res1 = get_res(); 
    assert!(res1.is_ok()); 
    assert_eq!("just for test", res1.unwrap()); //error 
} 

Lỗi này là:

error: no method named `unwrap` found for type `std::result::Result<(MyStruct1, std::collections::BTreeMap<std::string::String, std::string::String>), Error>` in the current scope 
    --> src/main.rs:13:38 
    | 
13 |  assert_eq!("just for test", res1.unwrap()); //error 
    |          ^^^^^^ 
    | 
    = note: the method `unwrap` exists but the following trait bounds were not satisfied: `Error : std::fmt::Debug` 
+0

thử 'assert_eq! (Res1.unwrap()," chỉ để kiểm tra "); ' – Virbhadrasinh

+1

có thể trùng lặp của [Loại kết quả không thực hiện phương thức trong phạm vi có tên \' unwrap \ '] (http://stackoverflow.com/questions/30787271/result-type-does-not-implement-method-in-scope-named-unwrap) –

Trả lời

15

Nếu bạn đọc tài liệu cho Result::unwrap, bạn sẽ lưu ý rằng đó là dưới một phần nhỏ gọi là:

impl<T, E> Result<T, E> 
    where E: Debug 

Điều này có nghĩa các phương pháp trong phần đó chỉ tồn tại chừng nào những hạn chế đưa ra là sati sfied.

Lý do duy nhất unwrap không tồn tại là Error không triển khai Debug.

+0

Bạn có biết nếu có một yêu cầu tính năng được mở đối với rustc để liệt kê rõ ràng * tại sao * các phương thức không được xem xét khi nó tìm phương pháp với tên đúng? Nó có thể là khó khăn, cho các tên phổ biến, mặc dù họ có thể được ưu tiên trong một số có thể và giới hạn về số lượng, tuy nhiên đây là điều tôi thấy vô giá trong C++ SFINAE kể từ khi Clang giới thiệu tính năng này. –

+1

@MatthieuM. Tôi thực sự [mở một câu trả lời cho câu hỏi này] (https://github.com/rust-lang/rust/issues/26516). –

+0

@DK .: Tôi không thể bình luận về nó ngay bây giờ, bạn có thể muốn đề cập đến rằng Clang quản lý nó với loại trừ SFINAE về phương pháp mẫu trong C++, đó là khá tương tự (kể từ SFINAE là về chọn lọc phương pháp tùy thuộc vào một số điều kiện). Điều này không chỉ có nghĩa là tính năng này thực sự có thể triển khai được, nhưng cũng có thể cung cấp việc triển khai tham chiếu cho một người thực hiện sẽ là người thực hiện. –

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