2015-05-25 14 views
5

मेरे पास दो प्रकार हैं जिनका समानता के लिए परीक्षण किया जा सकता है। हालांकि, एक बार जब मैं उन्हें Option एस में लपेटता हूं, तो विभिन्न PartialEq कार्यान्वयन द्वारा प्रदान की गई निस्संदेह खिड़की से बाहर निकलती है। मुझे map का उपयोग करना होगा या अन्यथा उन्हें परिवर्तित करना होगा।समानता के लिए दो विकल्पों का परीक्षण करने का सबसे बेवकूफ तरीका क्या है जब वे मूल्यों को समानता के लिए परीक्षण किया जा सकता है?

उदाहरण के लिए, के &str और String का उपयोग करते हैं:

fn main() { 
    let a = "hello"; 
    let b = "hello".to_owned(); 

    assert_eq!(a, b); // Just fine 

    let a = Some(a); 
    let b = Some(b); 

    // error: mismatched types 
    assert_eq!(a, b); 

    // error: mismatched types 
    assert_eq!(a, b.as_ref()); 

    // works, but highly tied to strings or slices, 
    // requires me to remember which is which 
    assert_eq!(a, b.map(|x| &x[..])); 
} 
वहाँ

निश्चित रूप से यह करने के लिए एक सरल या सीधी-सपाट तरीका होना चाहिए?

साइड-प्रश्न - PartialEq को थोड़ा अधिक व्यापक रूप से कार्यान्वित करने से क्या रोकता है? मैं समेकन का अनुमान लगा रहा हूं, मेरा पुराना दासता

impl<T, U> PartialEq<Option<U>> for Option<T> 
where 
    T: PartialEq<U>, 

RFCs और जंग मुद्दों (1, 2) में इस बारे में कुछ बकवास नहीं है।

उत्तर

0

ऐसा करने के लिए तकनीकी कारण प्रतीत नहीं होता है, ऐसा लगता है कि यह केवल कार्यान्वयन कार्य करने का मामला है।

+0

मैंने वास्तव में इसे जोड़ने के लिए जंग को पैच लगाने की कोशिश की थी। हालांकि, यह पता चला है कि इसे भाषा में जोड़ना आसान नहीं है क्योंकि यह संस्करण 1.1 पर मौजूद है। मुख्य मुद्दों में से एक यह है कि 'कोई नहीं' संदिग्ध हो जाएगा, और आपको * किस प्रकार का 'कोई नहीं' * निर्दिष्ट करना होगा: 'कोई नहीं :: '। जाहिर है, यह ergonomics के लिए बहुत भयानक है। – Shepmaster

+0

यह एक बहुत अच्छा जवाब नहीं है। तो आप समानता जांच कैसे करते हैं? 'मानचित्र' के साथ? –

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

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