1.40.0 صدأ الإصدار: # [غير شاملة] ، والتحسينات الكلية ، وغيرها من التحسينات

يسر فريق Rust الإعلان عن إصدار نسخة جديدة ، 1.40.0. Rust هي لغة برمجة تسمح للجميع بإنشاء برامج موثوقة وفعالة.


إذا قمت بتثبيت الإصدار السابق من Rust باستخدام rustup ، ثم للترقية إلى الإصدار 1.40.0 ، تحتاج فقط إلى تشغيل الأمر التالي:


 $ rustup update stable 

إذا لم تكن قد قمت بالفعل بتثبيت rustup ، فيمكنك تثبيته من الصفحة المقابلة لموقعنا على الويب ، وكذلك الاطلاع على ملاحظات الإصدار التفصيلية على GitHub.


ما هو مدرج في الإصدار المستقر 1.40.0


الابتكارات الرئيسية هي مقدمة السمة #[non_exhaustive] ، والتحسينات على macros!() و #[attribute] . أخيرًا ، أصبحت تحذيرات محلل الترحيل للمقترض أخطاء في Rust 2015. راجع ملاحظات الإصدار لمزيد من المعلومات.


#[non_exhaustive] الهياكل ، التعداد ، وخيارات التعداد


افترض أنك مؤلف مكتبة alpha تحتوي على pub struct Foo . ترغب في جعل حقول بنية alpha::Foo عامة ، لكنك لست متأكدًا مما إذا كان سيتعين عليك إضافة المزيد من الحقول إلى Foo في الإصدارات المستقبلية. هناك معضلة: إما أن تجعل الحقول خاصة بالمضايقات اللاحقة ، أو تتعرض لخطر جعل المستخدمين يعتمدون على الحقول ثم تنتهك التعليمات البرمجية الخاصة بهم عند إضافة حقول جديدة. يقدم Rust 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] الإنشاءات لخيار التعداد #[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 */ } //~^ ;      , //   ,        . } 

بدلاً من ذلك ، يجب أن تنظر الحزم الأخرى الآن في إمكانية وجود خيارات تعداد جديدة ، على سبيل المثال ، إضافة _ wildcard:


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

تتوفر تفاصيل السمة #[non_exhaustive] في تقرير التثبيت .


تحسينات الماكرو والسمة


في 1.40.0 ، أجرينا العديد من التحسينات على وحدات الماكرو والسمات ، بما في ذلك:


  • mac!() في سياقات النوع.


    على سبيل المثال ، يمكنك كتابة type Foo = expand_to_type!(bar); حيث expand_to_type سيكون ماكرو إجرائي.


  • extern { ... } الكتل extern { ... } .


    تتضمن هذه الكتلة make_item!() . على سبيل المثال:


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

    وحدات الماكرو الإجرائية الخاصة بالعناصر الموجودة في الكتل extern { ... } مدعومة الآن أيضًا:


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

  • macro_rules! العناصر في وحدات الماكرو الإجرائية.


    وحدات الماكرو التي تحتوي على بناء جملة الدالة ( mac!() ) ويمكن الآن للسمات ( #[mac] ) إنشاء macro_rules! . راجع تقرير التثبيت المرفق لمزيد من التفاصيل.


  • 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


في الإصدار 1.35.0 ، أبلغنا أن NLL ظهر في إصدار Rust 2015 بعد الإصدار الأول للنسخة 2018 في Rust 1.31 .


كما قلنا ، قد يسمح محلل الاقتراض القديم بإدارة ذاكرة غير آمنة ، ومع وجود محلل جديد (مدقق اقتراض NLL) ، تم حل هذه العيوب. نظرًا لأن هذه الأخطاء قد تؤدي إلى تعطيل الكود الثابت ، فقد قررنا تقديم هذه الأخطاء تدريجيًا ، والتحقق مما إذا كان المحلل القديم سيسمح بتجميع البرنامج وما إذا كان الجديد سيحظره. في هذه الحالات ، تم استبدال الأخطاء بتحذيرات.


استبدل الإصدار السابق من Rust 1.39.0 هذه التحذيرات بأخطاء في الكود مع إصدار 2018 . سيطبق Rust 1.40.0 نفس التغييرات على رمز إصدار 2015 ، مع إغلاق هذه الثغرات الأمنية بشكل دائم. جنبا إلى جنب مع هذا ، تم تنظيف المترجم حتى من الرمز القديم !


إذا لم يكن مشروعك بسبب التغييرات المذكورة أعلاه ، أو إذا كنت تريد معرفة المزيد ، فاقرأ منشور Niko Matsakis .


المزيد من الوظائف الثابتة في المكتبة القياسية


بدءًا من Rust 1.40.0 ، يتم تمييز الوظيفة التالية على أنها ثابتة ( const fn ):



وظائف مستقرة في المكتبة القياسية


تم تثبيت الوظائف ووحدات الماكرو التالية في Rust 1.40.0:



تغييرات أخرى


خضع بناء الجملة ومدير حزمة الشحن ومحلل Clippy أيضًا لبعض التغييرات.


يرجى قراءة ملاحظات التوافق لمعرفة ما إذا كانت هذه التغييرات تؤثر عليك.


الأعضاء 1.40.0


اجتمع الكثير من الأشخاص لإنشاء Rust 1.40.0. لا يمكن أن نفعل هذا بدونك جميعًا ، شكرًا !


من المترجمين


مع أي أسئلة حول لغة Rust ، سيتمكنون من مساعدتك في دردشة Telegram باللغة الروسية أو في دردشة مماثلة للوافدين الجدد .


تمت ترجمة هذا المقال بشكل مشترك بواسطة andreevlex و blandger و funkill و Hippolot و P0lunin و PsyHaSTe و LooMaclin .

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


All Articles