2015-04-27 12 views
12

द्वारा बाई-बाई नहीं जा सकता है पर cannot bind by-move into a pattern guard [E0008] की समस्या को मैं कैसे ठीक करूं?एक पैटर्न गार्ड

let res = match Some("hi".to_string()) { 
    Some(s) if s.len() == 0 => 1, 
    _ => 3 
}; 

वहाँ हाथ में हालत डाले बिना इसे बदलने की वैसे भी है?

उत्तर

13

इस मामले में, आप संदर्भ द्वारा बाध्य कर सकते हैं:

let res = match Some("hi".to_string()) { 
    Some(ref s) if s.len() == 0 => 1, 
    _ => 3 
}; 

सामान्य समस्या यहां कहा कि इस कदम से बाध्यकारी, मूल चर के आगे का उपयोग करता है की अनुमति नहीं देने चाहिए के रूप में बाहर डेटा ले जाने को अमान्य कर रहा है। यदि गार्ड false है, तो मूल चर को बाद के पैटर्न के खिलाफ मिलान करने के लिए उपयोग किया जाना चाहिए, जो चलने के कारण अवैध है।

उदाहरण के लिए:

fn f(x: Option<String>) { 
    match x { 
     Some(a) if { drop(a); false } => println!("impossible"), 
     Some(b) => println!("whoops, {}", b), 
     None => println!("none"), 
    } 
} 

तो xSome है, आंतरिक String बाहर चले गए और पुनः आवंटित की जाती निर्णय लेते समय अगर a हाथ लिया जाना चाहिए है, लेकिन है कि एक ही String तुरंत एक बार b बांह के लिए फिर से प्रयोग किया जाता है a हाथ खारिज कर दिया गया है।

+2

तो मूल रूप से संकलक कह रहा है कि "अरे, मैं गार्ड स्टेटमेंट में 'ई' को स्थानांतरित करने में प्रसन्न हूं, लेकिन यदि गार्ड स्टेटमेंट विफल रहता है, तो कोई रास्ता नहीं है कि मैं 'ई' वापस ले जाऊं। तो एकमात्र तरीका यह काम करने वाला है अगर आप मुझे गार्ड स्टेटमेंट की जांच करने के लिए 'ई' उधार लेते हैं। " –

+1

क्या होगा यदि मुझे गार्ड अभिव्यक्ति में स्वामित्व की आवश्यकता नहीं है, लेकिन शरीर में क्या करें? – Thayne

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