2015-06-23 8 views
10

क्या एक अजीब त्रुटि:परिणाम "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 
} 

त्रुटि है:

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

'assert_eq! (Res1.unwrap(), "केवल परीक्षण के लिए" कोशिश करें; ' – Virbhadrasinh

+1

संभावित डुप्लिकेट [परिणाम प्रकार \' unwrap \'] नामक दायरे में विधि लागू नहीं करता है (http://stackoverflow.com/प्रश्न/30787271/परिणाम-प्रकार-करता-नहीं-कार्यान्वयन-विधि-इन-स्कोप-नाम-अनचाप) –

उत्तर

15

आप Result::unwrap के लिए दस्तावेज़ पढ़ें, तो आप ध्यान दें हूँ कि यह एक छोटी सी नाम के अनुभाग में बताया गया है:

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

इसका मतलब है कि उस अनुभाग में विधियां केवल मौजूद हैं, जब तक कि दी गई बाधाएं सती हैं sfied।

एकमात्र कारण unwrap मौजूद नहीं होगा ErrorDebug लागू नहीं करता है।

+0

क्या आप जानते हैं कि rustc के खिलाफ स्पष्ट रूप से सूचीबद्ध करने के लिए कोई सुविधा अनुरोध खोला गया है * क्यों * विधियों पर विचार नहीं किया गया था यह सही नाम के साथ तरीकों पाता है? सामान्य नामों के लिए यह मुश्किल हो सकता है, हालांकि कुछ लोगों में उन्हें प्राथमिकता दी जा सकती है और संख्या में सीमित हो सकता है, हालांकि यह कुछ ऐसा है जो मुझे सी ++ एसएफआईएनएई में अमूल्य पाया गया क्योंकि क्लैंग ने इस सुविधा को पेश किया था। –

+1

@MatthieuM। मैं वास्तव में [इस प्रश्न के जवाब में एक खोला] (https://github.com/rust-lang/rust/issues/26516)। –

+0

@ डीके .: मैं अभी इस पर टिप्पणी नहीं कर सकता, आप शायद यह उल्लेख करना चाहें कि क्लैंग इसे C++ में टेम्पलेट विधियों पर SFINAE बहिष्करण के साथ प्रबंधित करता है, जो काफी समान है (क्योंकि SFINAE कुछ शर्तों के आधार पर विधियों को हल करने के बारे में है)। इसका मतलब यह नहीं है कि सुविधा वास्तव में लागू करने योग्य है, लेकिन एक कार्यान्वयनकर्ता के लिए एक संदर्भ कार्यान्वयन भी प्रदान कर सकता है। –

संबंधित मुद्दे