जैसे कि मूल pointed out by DK., तो आप एक बंद के तर्कों के लिए अतिरिक्त बाधाओं लागू करते हैं और मूल्यों वापस जाने के लिए एक समारोह का उपयोग कर सकते हैं:
fn constrain<F>(f: F) -> F
where
F: for<'a> Fn(&'a mut SplitWhitespace)
-> Result<&'a str, ParserError>,
{
f
}
यह आपको where
खंड के पूर्ण क्षमताओं देता है; इस मामले में आप उच्च-रैंकिंग विशेषता सीमा (for <...>
) का उपयोग यह कहने के लिए कर सकते हैं कि बंद करने के लिए उसी जीवनकाल के संदर्भ को तर्क के रूप में संदर्भित करना होगा।
let nt = constrain(|t| t.next().ok_or(missing_token(line_number)));
अंत में, इस limitations in Rust's type inference के कारण होता है। विशेष रूप से, यदि किसी फ़ंक्शन को तुरंत उपयोग किए जाने वाले फ़ंक्शन पर पास किया जाता है, तो संकलक अनुमान लगा सकता है कि तर्क और वापसी प्रकार क्या हैं। दुर्भाग्यवश, जब इसे उपयोग करने से पहले एक चर में संग्रहीत किया जाता है, तो संकलक समान स्तर का अनुमान नहीं करता है।
यह कामकाज काम करता है क्योंकि यह तुरंत किसी फ़ंक्शन को बंद कर देता है, जो प्रकारों और आजीवन संदर्भों को कम करता है।
इसे प्रबंधित नहीं कर सकता है। बेशक 'एफएन' काम' एफएन एनटी <'a> (टी: और 'एक म्यूट स्प्लिट व्हाइटस्पेस, लाइन_नंबर: उपयोग) -> परिणाम <&' एक स्ट्र, पार्सर एरर> { t.next()। Ok_or (missing_token (line_number)) } ' – tafia
संबंधित: http://stackoverflow.com/questions/29714934/how-can-i-specify-a-lifetime-for-closure-arguments –