إصدار 1.38.0 الصدأ: تجميع خطوط الأنابيب ، # [مهملة] لوحدات الماكرو و std :: any :: type_name

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


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


rustup update stable 

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


ما هو مدرج في نسخة مستقرة؟


تسليط الضوء على هذا الإصدار هو تجميع الأنابيب.


تجميع خطوط الأنابيب


لا يحتاج المحول البرمجي إلى تبعيات مجمعة بالكامل لإنشاء الحزمة ، ولكن فقط "بيانات التعريف" الخاصة بهم (قائمة الأنواع ، التبعيات ، الصادرات ، إلخ) التي تم إنشاؤها في مرحلة مبكرة من التجميع. بدءًا من Rust 1.38.0 ، ستبدأ Cargo على الفور في إنشاء حزم تعتمد بمجرد توفر بيانات التعريف الخاصة بها.


لم يتناقص وقت إنشاء حزمة واحدة ، لكن اختباراتنا أظهرت أن سرعة التجميع تزيد بنسبة 10٪ إلى 20٪ في حالة الإنشاءات المحسنة (حيث يتم تجميع بعض التبعيات بالفعل). بالنسبة للحزم الأخرى ، لم تحدث زيادة كبيرة في سرعة التحويل البرمجي. يعتمد الوقت المستغرق لإنشاء الحزمة على الكمبيوتر ، لذلك قد يختلف الأداء. يتم تمكين تجميع خطوط الأنابيب تلقائيًا من الإصدار 1.38.0.


التحقق من بعض إساءة استخدام mem::{uninitialized, zeroed}


كما أعلن سابقا ، لا ينصح std::mem::uninitialized . بدلاً من ذلك ، يجب استخدام MaybeUninit<T> .


لم يتم إهمال الدالة mem::uninitialized ، ولكن سيتم ذلك في الإصدارات المستقبلية. ولكن على الرغم من ذلك ، بدءًا من 1.38.0 ، rustc عن فئة ضيقة من التهيئة غير الصحيحة باستخدام mem::uninitialized أو mem::zeroed .


بالنسبة إلى بعض الأنواع ، مثل &T و Box<T> ، تعتبر القيمة الخالية سلوكًا غير محدد ، حيث إنها كائنات تشبه المؤشر ولا ينبغي أن تكون null . سيكون من الخطأ استخدام mem::uninitialized أو mem::zeroed لتهيئة هذه الأنواع ، لذلك سيحاول المحول البرمجي تحذيرك إذا تم استخدام أي من هذه الوظائف لتهيئة الكائنات المذكورة أعلاه ، ولا يهم ما إذا كانت قد تمت تهيئتها مباشرةً أم لا مجالات هيكل كبير. هذا الاختيار متكرر ، وبالتالي فإن الكود التالي يستلزم تحذيرًا:


 struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() }; 

قد يلاحظ القراء المهتمون أن المكتبة القياسية تحتوي على المزيد من الأنواع التي لا ينبغي ملؤها NonNull<T> ، وخاصة NonNull<T> و NonZero<T> . حتى الآن ، لم يتم التحقق من تهيئة هذه الهياكل باستخدام mem::uninitialized أو mem::zeroed .


لا تغطي عمليات التحقق هذه جميع حالات الاستخدام غير الصحيح لـ mem::uninitialized أو mem::zeroed ، ولكنها تتيح لك اكتشاف رمز غير صحيح مضمون يجب أن يتحول إلى MaybeUninit .


#[deprecated] لوحدات الماكرو


السمة #[deprecated] ، التي تم تقديمها لأول مرة في Rust 1.9.0 ، تسمح لمؤلفي الحزم بإعلام المستخدمين بالوظائف القديمة التي يخططون لإزالتها في الإصدارات المستقبلية. صدأ 1.38.0 يسمح لك بتطبيق هذه السمة على وحدات الماكرو.


std::any::type_name


قد تكون هناك حاجة إلى تمثيل سلسلة من النوع المستخدم عند تصحيح التعليمات البرمجية. على سبيل المثال ، في نص دالة عامة ، قد ترغب في طباعة نوع الوسيطة التي تم تمريرها. هذا std::any::type_name الآن مع std::any::type_name :


 fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); } 

النتيجة:


 Initializing an instance of i32 Initializing an instance of alloc::string::String 

مثل جميع وظائف المكتبة القياسية ، المعدة فقط للتصحيح ، هذه الوظيفة لا تضمن بالضبط محتويات وتنسيق السلسلة. قيمة الإرجاع هي أفضل وصف للنوع ؛ قد يتم تمثيل أنواع متعددة بنفس type_name ، لكنه قد يتغير في الإصدارات المستقبلية من المحول البرمجي.


التغييرات في المكتبة القياسية



بالإضافة إلى ذلك ، تم تثبيت بعض الوظائف:



تغييرات أخرى


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


الأعضاء 1.38.0


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


من المترجمين


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


تمت ترجمة هذا المقال بشكل مشترك بواسطة andreevlex و nlinker و funkill و Gymmasssorla .

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


All Articles