2015-02-18 6 views
18

यहाँ दो समारोह हस्ताक्षर मैं जंग दस्तावेज में देखा हैं:एक परिवर्तनीय नाम से पहले और ":" के बाद "mut" रखने के बीच क्या अंतर है?

fn modify_foo(mut foo: Box<i32>) { *foo += 1; *foo } 
fn modify_foo(foo: &mut i32) { *foo += 1; *foo } 

क्यों mut के विभिन्न प्लेसमेंट?

ऐसा लगता है पहले समारोह भी

रूप
fn modify_foo(foo: mut Box<i32>) { /* ... */ } 

उत्तर

21

mut foo: T मतलब है कि आप एक चर foo कहा जाता है कि एक T है घोषित किया जा सकता है। आप को बदलने के लिए क्या चर संदर्भित करता है अनुमति दी जाती है:

let mut val1 = 2; 
val1 = 3; // OK 

let val2 = 2; 
val2 = 3; // error: re-assignment of immutable variable 

यह भी आपको लगता है कि आपके स्वामित्व वाले struct के क्षेत्र को बदल सकता है:

struct Monster { health: u8 } 

let mut orc = Monster { health: 93 }; 
orc.health -= 54; 

let goblin = Monster { health: 28 }; 
goblin.health += 10; // error: cannot assign to immutable field 

foo: &mut T इसका मतलब है आप एक ऐसा वैरिएबल को संदर्भित करता है (&) एक मूल्य है और आप को बदल सकते हैं (mut) (क्षेत्रों सहित में भेजा मूल्य, एक struct यह है अगर):

let val1 = &mut 2; 
*val1 = 3; // OK 

let val2 = &2; 
*val2 = 3; // error: cannot assign to immutable borrowed content 

ध्यान दें कि &mut केवल संदर्भ के साथ समझ में आता है - foo: mut T मान्य वाक्यविन्यास नहीं है। जब आप समझ में आता है तो आप दो क्वालीफायर (let mut a: &mut T) को भी जोड़ सकते हैं।

+4

मैं देखता हूं। मुझे लगता है कि यह सी ++ में है जहां आप अलग-अलग चीजों को प्राप्त करने के लिए 'int const * 'बनाम' int * const' प्राप्त कर सकते हैं। –

+2

@ शेमपस्टर आप जोड़ना चाहते हैं कि बाध्यकारी पर 'mut' आपको संरचना के अंदर उत्परिवर्तित करने की अनुमति देता है (यदि यह एक संरचना है)। –

+0

मुझे लगता है कि यह मेरे लिए खड़ा है कि जंग क्यों सिंटैक्स 'चलो foo: mut टाइप' की अनुमति नहीं देता है? ऐसा लगता है कि चूंकि हमारे पास पहले से ही अपरिहार्य 'और म्यूट' है जिसमें 'mut' बाईं ओर दिखाई नहीं दे सकता है, यह कहना अधिक समान है कि' म्यूट 'केवल दाईं ओर दिखाई दे सकता है? –

19

आप C/C++ से आ रहे हैं, यह भी इस तरह मूल रूप से इसके बारे में सोचने के लिए उपयोगी हो सकता है:

// Rust   C/C++ 
    a: &T  == const T* const a; // can't mutate either 
mut a: &T  == const T* a;  // can't mutate what is pointed to 
    a: &mut T == T* const a;  // can't mutate pointer 
mut a: &mut T == T* a;    // can mutate both 

आप देखेंगे कि ये एक-दूसरे के प्रतिलोम हैं पर ध्यान देंगे। सी/सी ++ एक "ब्लैकलिस्ट" दृष्टिकोण लेता है, जहां आप कुछ अपरिवर्तनीय होना चाहते हैं, तो आपको इतना स्पष्ट रूप से कहना होगा, जबकि जंग एक "श्वेतसूची" दृष्टिकोण लेता है, जहां आप कुछ म्यूटेबल होना चाहते हैं, तो आपको स्पष्ट रूप से कहना होगा।

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