एक बंद Fn, FnMut और FnOnce को कब लागू करता है?


114

एक बंद करने के लिए , और लक्षणों को लागू करने के लिए विशिष्ट शर्तें क्या हैं ?FnFnMutFnOnce

अर्थात्:

  • एक बंद कब विशेषता को लागू नहीं करता है FnOnce?
  • एक बंद कब विशेषता को लागू नहीं करता है FnMut?
  • एक बंद कब विशेषता को लागू नहीं करता है Fn?

उदाहरण के लिए, शरीर पर बंद होने की स्थिति को बदलना, संकलक Fnको उस पर लागू नहीं करता है।


11
क्या आपने हाल ही में इस महान लेख को बंद होने पर देखा है ?
शमपास्टर

जवाबों:


126

लक्षण प्रत्येक को बंद करने / कार्यों के बारे में अधिक से अधिक प्रतिबंधात्मक गुणों का प्रतिनिधित्व करते हैं, उनकी call_...पद्धति के हस्ताक्षरों से संकेत मिलता है , और विशेष रूप से इसके प्रकार self:

  • FnOnce( self) ऐसे कार्य हैं जिन्हें एक बार बुलाया जा सकता है
  • FnMut( &mut self) वे कार्य हैं जिन्हें कहा जा सकता है यदि &mutउनके पर्यावरण तक पहुंच हो
  • Fn( &self) ऐसे कार्य हैं जिन्हें कहा जा सकता है यदि उनके पास केवल &अपने पर्यावरण तक पहुंच हो

एक बंद |...| ...स्वचालित रूप से उन में से कई को लागू करेगा जितना यह कर सकता है।

  • सभी क्लोजर लागू होते हैं FnOnce: एक क्लोजर जिसे एक बार नहीं बुलाया जा सकता है वह नाम के लायक नहीं है। ध्यान दें कि यदि एक बंद केवल लागू होता है FnOnce, तो इसे केवल एक बार ही बुलाया जा सकता है।
  • क्लोज़र जो अपनी कैद से बाहर नहीं निकलते हैं FnMut, उन्हें लागू करने की अनुमति देता है, ताकि उन्हें एक से अधिक बार कॉल किया जा सके (यदि फ़ंक्शन ऑब्जेक्ट पर कोई पहुंच नहीं है)।
  • क्लोज़र जिन्हें अपनी कैप्चर कार्यान्वयन के लिए अद्वितीय / परस्पर उपयोग की आवश्यकता नहीं है Fn, उन्हें हर जगह अनिवार्य रूप से बुलाया जा सकता है।

ये प्रतिबंध सीधे selfऔर संरचना में बंद होने के "उतरने" के प्रकार से अनुसरण करते हैं; रस्ट में मेरे ब्लॉग पोस्ट फाइंडिंग क्लोजर में वर्णित है ।

क्लोजर के बारे में जानकारी के लिए, क्लोज़र: बेनामी फ़ंक्शंस देखें, जो रस्ट प्रोग्रामिंग लैंग्वेज में उनके पर्यावरण पर कब्जा कर सकते हैं


यदि कोई बंद केवल लागू FnOnceकरता है, तो क्या इसका मतलब यह है कि इसे केवल एक बार कहा जा सकता है?
nalply

@ हंसते हुए, हाँ, केवल एक बार।
हियोन

9
मैंने गलत तरीके से की गई टिप्पणी को गलत बताया और इससे मुझे कुछ भ्रम हुआ। भविष्य के पाठकों, कृपया ध्यान दें कि उन्होंने कहा "यदि एक बंद केवल लागू करता है FnOnce"।
स्लीपेर

2
कार्यान्वयन विस्तार: स्वचालित रूप से उन लोगों में से कई को लागू करेगा जो यह कर सकते हैं। यह पूरी तरह सच नहीं है, अगर जरूरत लगती है तो यह अपने आप ही इसे लागू कर देगा। आप एक बंद करने के लिए एक लापता Fn-impl का पता लगा सकते हैं जो विशेषज्ञता का उपयोग करके FnMut तर्क के लिए उपयोग किया गया था। यह बग github.com/rust-lang/rust/issues/26085
bluss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.