इस मामले में, आप संदर्भ द्वारा बाध्य कर सकते हैं:
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"),
}
}
तो x
Some
है, आंतरिक String
बाहर चले गए और पुनः आवंटित की जाती निर्णय लेते समय अगर a
हाथ लिया जाना चाहिए है, लेकिन है कि एक ही String
तुरंत एक बार b
बांह के लिए फिर से प्रयोग किया जाता है a
हाथ खारिज कर दिया गया है।
तो मूल रूप से संकलक कह रहा है कि "अरे, मैं गार्ड स्टेटमेंट में 'ई' को स्थानांतरित करने में प्रसन्न हूं, लेकिन यदि गार्ड स्टेटमेंट विफल रहता है, तो कोई रास्ता नहीं है कि मैं 'ई' वापस ले जाऊं। तो एकमात्र तरीका यह काम करने वाला है अगर आप मुझे गार्ड स्टेटमेंट की जांच करने के लिए 'ई' उधार लेते हैं। " –
क्या होगा यदि मुझे गार्ड अभिव्यक्ति में स्वामित्व की आवश्यकता नहीं है, लेकिन शरीर में क्या करें? – Thayne