أقدم انتباهكم إلى ترجمة المنشور على الإصدار الجديد من لغة البرمجة المفضلة لدى الجميع Rust .
مقدمة
يسر فريق لغة برمجة Rust الإعلان عن إصدار جديد ، 1.35.0. Rust هي لغة برمجة تتيح للجميع تطوير برامج موثوقة وسريعة.
إذا قمت بتثبيت الإصدار السابق من Rust باستخدام rustup
، فلن يكون الحصول على الإصدار الحالي أمرًا صعبًا:
$ rustup update stable
إذا كنت لا تزال غير rustup
، فيمكنك الحصول عليها من الصفحة المقابلة على موقعنا. تتوفر مراجعة مفصلة لهذا الإصدار على جيثب.
ما هو مدرج في نسخة مستقرة؟
تتضمن الابتكارات الرئيسية لهذا الإصدار تطبيق FnOnce و FnMut
و Fn
FnMut
على Box<dyn FnOnce>
و Box<dyn FnMut>
و Box<dyn Fn>
.
وكذلك يمكن تحويل الدالات المضمنة (الإغلاق) إلى مؤشرات دالة غير آمنة. ماكرو dbg!
المقدمة في Rust 1.32.0 يمكن الآن استدعاء دون تحديد الوسائط.
علاوة على ذلك ، قدم هذا الإصدار العديد من عمليات التثبيت للمكتبة القياسية. فيما يلي أهمها ، لكن التحليل التفصيلي لبعضها متاح.
سمات Fn*
المنفذة على Box<dyn Fn*>
في Rust 1.35.0 ، FnMut
تطبيق FnMut
FnOnce
و FnMut
و Fn
على Box<dyn FnOnce>
و Box<dyn FnMut>
و Box<dyn Fn>
على التوالي.
في الماضي ، إذا أردت استدعاء دالة مغلفة في Box<T>
، كان عليك استخدام FnBox
، لأن كائنات Box<dyn FnOnce>
وما شابهها لم تنفذ سمات Fn*
المقابلة. تداخل أيضًا مع نقل الوظائف المُضمَّنة في Box<T>
إلى الكود الذي كان ينتظر تطبيق سمة Fn
(تم اقتراح إنشاء وظائف مدمجة مؤقتة).
حدث هذا بسبب عدم قدرة برنامج التحويل البرمجي على اكتشاف هذه التطبيقات. تم إصلاح هذا الخلل مع إدخال unsized_locals
.
ومع ذلك ، يمكنك الآن استخدام الدالات المضمّنة في Box<T>
حتى في الأماكن التي تتوقع تنفيذ سمة وظيفية. على سبيل المثال ، يتم تجميع التعليمات البرمجية أدناه دون أخطاء:
fn foo(x: Box<dyn Fn(u8) -> u8>) -> Vec<u8> { vec![1, 2, 3, 4].into_iter().map(x).collect() }
يمكن استدعاء Box<dyn FnOnce>
دون Box<dyn FnOnce>
الضجة:
fn foo(x: Box<dyn FnOnce()>) { x() }
تحويل إلى مؤشرات غير آمنة
منذ أوقات Rust 1.19.0 ، أصبح من الممكن تحويل الوظائف المدمجة التي لا تلتقط البيئة إلى مؤشرات دالة. على سبيل المثال ، يمكنك الكتابة:
fn twice(x: u8, f: fn(u8) -> u8) -> u8 { f(f(x)) } fn main() { assert_eq!(42, twice(0, |x| x + 21)); }
لكن لسوء الحظ ، لم يتم توسيع هذه الميزة لتشمل مؤشرات الوظائف غير الآمنة. قدم هذا الإصدار التغييرات الموضحة أعلاه:
استدعاء dbg!()
مع عدم وجود الحجج
بسبب وفرة المكالمات println!
كما مصحح الأخطاء الجماعية ، تم تقديم الماكرو dbg في Rust 1.32.0 dbg!
. تذكر أن هذا الماكرو يسمح لك بالتقاط بسرعة نتيجة تعبير معين مع السياق:
fn main() { let mut x = 0; if dbg!(x == 1) { x += 1; } dbg!(x); }
سيتم طباعة أسطر التعليمات البرمجية أعلاه إلى المحطة الطرفية نتيجة التعبير x == 1
و x
على التوالي:
[src/main.rs:4] x == 1 = false [src/main.rs:8] x = 0
كما هو مذكور في القسم السابق ، حيث يمكن استدعاء دالة ذات ترتيب call_unsafe_fn_ptr
dbg!()
كما يجب استدعاؤها دون تحديد الوسائط. يمكن أن يكون هذا مفيدًا للغاية لاكتشاف فروع البرنامج المحددة:
fn main() { let condition = true; if condition { dbg!();
استقرار المكتبة القياسية
في Rust 1.35.0 ، تم تثبيت العديد من مكونات المكتبة القياسية. بالإضافة إلى ذلك ، تم تقديم بعض التطبيقات ، والتي يمكنك قراءتها هنا .
انسخ علامة رقم الفاصلة العائمة إلى رقم آخر
مع هذا الإصدار ، تمت إضافة طرق copysign
جديدة إلى copysign
العائمة (بشكل أكثر تحديدًا ، f32
و f64
):
كاسم الأساليب المقترحة ، يمكنك استخدامها لنسخ علامة رقم واحد إلى آخر:
fn main() { assert_eq!(3.5_f32.copysign(-0.42), -3.5); }
التحقق من احتواء Range
على قيمة محددة
حصل Rust 1.35.0 على طريقتين جديدتين على هياكل Range*
:
باستخدام هذه الطرق ، يمكنك التحقق بسهولة من وجود قيمة معينة في نطاق ما. على سبيل المثال ، يمكنك الكتابة:
fn main() { if (0..=10).contains(&5) { println!("5 [0; 10]."); } }
ترجمة (خريطة) وتقسيم RefCell
المقترضة
مع ظهور Rust 1.35.0 ، يمكنك ترجمة وتقسيم قيمة RefCell
المقترضة إلى مجموعة من القيم المقترضة إلى مكونات مختلفة من البيانات المستعارة:
RefCell
قيمة RefCell
عبر وظيفة مضمنة
يقدم هذا الإصدار طريقة RefCell
بنية RefCell
:
تجزئة المؤشر أو الارتباط بـ
يقدم هذا الإصدار وظيفة ptr::hash
، والتي تأخذ مؤشرًا خامًا للتجزئة. باستخدام ptr::hash
يمكن أن يمنع تجزئة القيمة المحددة أو المرجعية بدلاً من العنوان نفسه.
نسخ Option<&T>
المحتوى Option<&T>
مع بدء تطبيق Rust 1.0.0 ، Option::cloned
طرق Option::cloned
على Option<&T>
Option<&mut T>
استنساخ المحتوى إذا كان موجودًا ( Some(_)
). ومع ذلك ، يمكن أن يكون الاستنساخ عملية مكلفة في بعض الأحيان ، ولم opt.cloned()
أساليب opt.cloned()
أي تلميحات.
ساهم هذا الإصدار:
وظيفة opt.copied()
هي نفسها opt.cloned()
. ومع ذلك ، تطلب الطريقة الموضحة أعلاه الشروط T: Copy
، والتي سيؤدي فشلها إلى حدوث خطأ في الترجمة.
التغييرات Clippy
اكتسبت drop_bounds
، وهي أداة تمسك بالعيوب الشائعة لتحسين جودة الشفرة ، drop_bounds
. إنها تعمل عندما تطلب الوظيفة المعممة تحقيق الشرط T: Drop
:
fn foo<T: Drop>(x: T) {}
هذا غالبًا ما يكون خطأ لأن البدائيين لا يقومون بتطبيق Drop
. علاوة على ذلك ، لا يغطي T: Drop
أنواعًا مثل String
، التي ليس لديها سلوك مدمر ، بل هي نتيجة للأنواع المضمّنة (مثل Vec<u8>
).
بالإضافة إلى drop_bounds
، يقسم هذا الإصدار redundant_closure
إلى redundant_closure
و redundant_closure_for_method_calls
.
قراءة الإصدار المفصل من Clippy هنا .
التغييرات في البضائع
وصف مفصل للتغييرات البضائع متاحة هنا .
الأعضاء 1.35.0
اجتمع الكثير من الأشخاص لإنشاء Rust 1.35.0. لا يمكن أن نفعل هذا بدونك جميعًا ، شكرًا !
من المترجم
مع أي أسئلة حول لغة Rust ، سيتمكنون من مساعدتك في دردشة Telegram باللغة الروسية أو في دردشة مماثلة للوافدين الجدد .