जंग 1.40.0 रिलीज: # [non_exerateive], मैक्रो एन्हांसमेंट्स, और अन्य एन्हांसमेंट्स

रस्ट टीम एक नए संस्करण, 1.40.0 की रिलीज की घोषणा करते हुए प्रसन्न है। जंग एक प्रोग्रामिंग भाषा है जो सभी को विश्वसनीय और कुशल सॉफ्टवेयर बनाने की अनुमति देती है।


यदि आपने जंग का उपयोग करके जंग के पिछले संस्करण को स्थापित किया है, तो संस्करण 1.40.0 में अपग्रेड करने के लिए आपको बस निम्नलिखित कमांड चलाने की आवश्यकता है:


 $ rustup update stable 

यदि आपने पहले से rustup स्थापित नहीं किया है, तो आप इसे हमारी वेबसाइट के संबंधित पेज से इंस्टॉल कर सकते हैं, साथ ही rustup पर विस्तृत रिलीज़ नोट्स भी देख सकते हैं।


स्थिर संस्करण 1.40.0 में क्या शामिल है


मुख्य नवाचारों की विशेषता #[non_exhaustive] , macros!() सुधार macros!() और #[attribute] की शुरूआत है। अंत में, उधारकर्ता की माइग्रेशन एनालाइज़र चेतावनी रूस्ट 2015 में बग बन गई। अधिक जानकारी के लिए रिलीज़ नोट देखें।


#[non_exhaustive] संरचनाएं, #[non_exhaustive] और एन्यूमरेशन विकल्प


मान लीजिए कि आप एक alpha लाइब्रेरी के लेखक हैं, जिसमें pub struct Foo । आप alpha::Foo के क्षेत्रों को बनाना चाहेंगे alpha::Foo संरचना को सार्वजनिक, लेकिन आपको यकीन नहीं है कि आपको भविष्य के रिलीज में Foo को अधिक फ़ील्ड जोड़ना होगा। एक दुविधा है: या तो आप खेतों को बाद की असुविधाओं से निजी बनाते हैं, या आप उपयोगकर्ताओं को खेतों पर निर्भर बनाने का जोखिम उठाते हैं और फिर नए जोड़ते समय उनके कोड का उल्लंघन करते हैं। रस्ट 1.40.0 #[non_exhaustive] साथ समस्या को हल करने का एक तरीका #[non_exhaustive]


एट्रिब्यूट #[non_exhaustive] एन्यूमरेशन की संरचना या संस्करण से जुड़ा हुआ है और खेतों की पूरी तुलना को रोकता है, उनके घोषणा के साथ टोकरे के बाहर उक्त संरचना या संस्करण का निर्माण। निम्न उदाहरण अल्फा-निर्भर beta टोकरा में त्रुटियों को प्रदर्शित करता है:


 // alpha/lib.rs: #[non_exhaustive] struct Foo { pub a: bool, } enum Bar { #[non_exhaustive] Variant { b: u8 } } fn make_foo() -> Foo { ... } fn make_bar() -> Bar { ... } // beta/lib.rs: let x = Foo { a: true }; //~  let Foo { a } = make_foo(); //~  let Foo { a, .. } = make_foo(); //~ OK // -- `beta`       . let x = Bar::Variant { a: 42 }; //~  let Bar::Variant { b } = make_bar(); //~  let Bar::Variant { b, .. } = make_bar(); //~ OK // -- `beta`    ... 

पर्दे के पीछे क्या चल रहा है? #[non_exhaustive] संरचना या गणना विकल्प के लिए कंस्ट्रक्टर्स की दृश्यता pub(crate) तक कम हो जाएगी, जिससे तीसरे पक्ष के बक्से में उनके उपयोग को रोक दिया जाएगा।


शायद #[non_exhaustive] का एक और महत्वपूर्ण पहलू यह है कि एक विशेषता खुद को एन्यूमरेशन से जुड़ी हो सकती है। ये कोड std::cmp::Ordering से लिया गया है:


 #[non_exhaustive] pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst } 

इस मामले में, #[non_exhaustive] भविष्य में नए विकल्पों को जोड़ने की संभावना की गारंटी देता है। यह अन्य पैकेजों को Ordering लिए संपूर्ण छवि मिलान का उपयोग करने से रोककर प्राप्त किया जाता है। कंपाइलर निम्नलिखित को अस्वीकार करेगा:


 match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { /* logic */ } //~^ ;      , //   ,        . } 

इसके बजाय, अन्य संकुल को अब नए गणना विकल्प की संभावना पर विचार करना चाहिए, उदाहरण के लिए, _ वाइल्डकार्ड को जोड़ना:


 match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { /* logic */ } _ => { /* logic */ } // OK;     ,   . } 

स्थिरीकरण रिपोर्ट में विशेषता #[non_exhaustive] पर विवरण उपलब्ध #[non_exhaustive]


मैक्रो एंड अट्रैक्शन एनहांसमेंट्स


1.40.0 में, हमने मैक्रोज़ और विशेषताओं में कई सुधार किए, जिनमें शामिल हैं:


  • mac!() प्रकार के संदर्भों में mac!()


    उदाहरण के लिए, आप type Foo = expand_to_type!(bar); कर सकते हैं type Foo = expand_to_type!(bar); जहां expand_to_type एक प्रक्रियात्मक मैक्रो होगा।


  • extern { ... } ब्लॉक।


    इस ब्लॉक में make_item!() मैक्रोज़ शामिल हैं। उदाहरण के लिए:


     macro_rules! make_item { ($name:ident) => { fn $name(); } } extern { make_item!(alpha); make_item!(beta); } 

    extern { ... } में तत्वों के लिए प्रक्रियात्मक मैक्रोज़ को शामिल करें extern { ... } ब्लॉक अब भी समर्थित हैं:


     extern "C" { #[my_identity_macro] //~  ,     `fn foo();`. fn foo(); } 

  • macro_rules! प्रक्रियात्मक मैक्रो में आइटम।


    फ़ंक्शन सिंटैक्स ( mac!() और विशेषताओं ( #[mac] ) के साथ मैक्रोज़ अब macro_rules! उत्पन्न कर सकते हैं macro_rules! । अधिक विवरण के लिए संलग्न स्थिरीकरण रिपोर्ट देखें।


  • $m:meta TokenStream $m:meta TokenStream का समर्थन करता है।


    अर्थात्, निम्न कोड सही है:


     macro_rules! accept_meta { ($m:meta) => {} } accept_meta!( my::path ); accept_meta!( my::path = "lit" ); accept_meta!( my::path ( abc ) ); accept_meta!( my::path [ abc ] ); accept_meta!( my::path { abc } ); 


उधारकर्ता पार्सर की माइग्रेशन चेतावनियां रस्ट 2015 संस्करण में बग बन जाती हैं


१.३५.० रिलीज़ में, हमने बताया कि NLL २०१५ संस्करण में रुस्ट १.३१ में २०१, संस्करण के लिए पहली रिलीज़ के बाद दिखाई दिया।


जैसा कि हमने कहा, पुराने उधार लेने वाले विश्लेषक असुरक्षित मेमोरी प्रबंधन की अनुमति दे सकते हैं, और नए विश्लेषक (एनएलएल उधारकर्ता चेकर) के साथ इन कमियों को हल किया गया था। चूंकि ये त्रुटियां स्थिर कोड को बाधित कर सकती हैं, इसलिए हमने धीरे-धीरे इन त्रुटियों को पेश करने का फैसला किया, यह जांचने के लिए कि क्या पुराने विश्लेषक प्रोग्राम की असेंबली की अनुमति देगा और क्या नया इसे ब्लॉक करेगा। इन मामलों में, चेतावनियों की जगह त्रुटियों को ले लिया गया था।


रस्ट 1.39.0 की पिछली रिलीज़ ने इन चेतावनियों को 2018 संस्करण के साथ कोड के लिए त्रुटियों के साथ बदल दिया। रस्ट 1.40.0 2015 संस्करण कोड में समान परिवर्तन लागू करेगा, इन सुरक्षा छेदों को स्थायी रूप से बंद कर देगा। इसके साथ ही पुराने कोड से कंपाइलर को भी साफ किया गया था !


यदि आपका प्रोजेक्ट उपरोक्त परिवर्तनों के कारण नहीं हो रहा है, या आप और अधिक जानना चाहते हैं, तो निको मत्सकिस की पोस्ट पढ़ें।


मानक पुस्तकालय में अधिक निरंतर कार्य


रुस्ट 1.40.0 से शुरू होकर, निम्न फ़ंक्शन को स्थिरांक (कॉन्स्टेबल const fn ) के रूप में चिह्नित किया गया है:



मानक पुस्तकालय में स्थिर कार्य


निम्नलिखित कार्य और मैक्रो को रुस्ट 1.40.0 में स्थिर किया गया था:


  • todo!()


    मैक्रो का एक छोटा, अधिक यादगार और अधिक सुविधाजनक संस्करण unimplemented!()


  • slice::repeat


    n स्लाइस पुनरावृत्ति से एक Vec<T> बनाता है।


  • mem::take


    यह फ़ंक्शन उत्परिवर्ती लिंक से मान लेता है और उन्हें इस प्रकार के लिए डिफ़ॉल्ट मान से बदल देता है। यह Option::take एंड Cell::take और mem::replace(&mut dst, Default::default()) लिए एक सुविधाजनक शॉर्टहैंड है mem::replace(&mut dst, Default::default())


  • BTreeMap::get_key_value और HashMap::get_key_value


    प्रदान की गई कुंजी से मेल खाते एक कुंजी-मूल्य जोड़ी देता है।


  • Option::as_deref , Option::as_deref_mut


    वे Option::as_ref और Option::as_mut समान कार्य करते हैं, लेकिन क्रमशः Deref और DerefMut उपयोग करते हैं, इसलिए opt_box.as_deref() और opt_box.as_deref_mut() , जहां opt_box: Option<Box<T>> , Option<&T> बनाएँ। Option<&T> और Option<&mut T> क्रमशः।


  • Option::flatten


    Iterator::flatten जैसे यह फंक्शन, Option<Option<T>> से Option<T> , Some(x) लिए Some(Some(x)) Some(x) उत्पादन करता है और None नहीं।


  • UdpSocket::peer_addr


    उस दूरस्थ होस्ट का पता देता है जिसमें सॉकेट जुड़ा हुआ है।


  • {f32,f64}::to_be_bytes , {f32,f64}::to_le_bytes , {f32,f64}::to_ne_bytes , {f32,f64}::from_be_bytes , {f32,f64}::from_le_bytes और {f32,f64}::from_ne_bytes


    बड़े-एंडियन (नेटवर्क), लिटिल-एंडियन या देशी-एंडियन बाइट ऑर्डर के साथ बाइट्स की एक सरणी के रूप में फ्लोटिंग पॉइंट नंबरों का मेमोरी प्रतिनिधित्व लौटाता है।



अन्य परिवर्तन


सिंटैक्स , कार्गो पैकेज मैनेजर, और क्लिप्पी विश्लेषक भी कुछ परिवर्तनों से गुजरे हैं।


इन परिवर्तनों का आप पर असर होता है या नहीं, यह देखने के लिए कृपया संगतता नोट पढ़ें।


सदस्य 1.40.0


रस्ट 1.40.0 बनाने के लिए बहुत सारे लोग एक साथ आए। हम आप सभी के बिना ऐसा नहीं कर सकते थे, धन्यवाद !


अनुवादकों से


रस्ट भाषा पर किसी भी प्रश्न के साथ, वे रूसी भाषा में टेलीग्राम चैट में या नवागंतुक के लिए एक समान चैट में आपकी सहायता करने में सक्षम होंगे।


इस लेख का अनुवाद संयुक्त रूप से andvvlex , Blandger , funkill , Hippolot , P0lunin , PsyHaSTe और LooMaclin द्वारा किया गया था

Source: https://habr.com/ru/post/hi481070/


All Articles