العودة
مقترح pre-RFC لإضافة وسائط مسماة واختيارية إلى Rust
SiTech AI Team3 წთ. საკითხავი

مقترح pre-RFC لإضافة وسائط مسماة واختيارية إلى Rust

يعتبر كاتب مدونة botahamec.dev أن غياب الوسائط المسماة والاختيارية أكبر نقص في لغة Rust؛ وتقارن التدوينة بين Dart وC# وTypeScript ثم تطرح مقترح pre-RFC خاصًا بها.

في تدوينة على botahamec.dev، يرى كاتبها أن أكبر نقص مزعج في لغة Rust هو غياب الوسائط المسماة والاختيارية. ويسرد اللغات التي "يتحمّلها" — Rust وC# وTypeScript وDart وPython — مشيرًا إلى أن Rust أصعبها في الحصول على وسائط مسماة، وتنتهي التدوينة بمقترح pre-RFC من إعداده.

كيف تتعامل لغات أخرى مع المسألة

لغة Dart، المصمّمة للواجهات الرسومية حيث تحمل المكوّنات معاملات اختيارية كثيرة، تغلّف المعاملات المسماة بأقواس معقوفة وتسمح بقيم افتراضية وبكلمة `required` وبوسائط موضعية اختيارية داخل أقواس مربعة، ويعتبر الكاتب هذا أفضل حل بين اللغات التي تناولها. وفي C# يمكن تسمية أي معامل أو منحه قيمة افتراضية شرط أن تأتي هذه القيم بعد المعاملات الإلزامية، كما يمكن تمرير الوسائط المسماة بترتيب مختلف. وفي TypeScript تعمل المعاملات الموضعية الاختيارية جيدًا، لكن الوسائط المسماة تتطلب تفكيك كائن مجهول واحد، أي كتابة أسماء الحقول مرتين، وهو ما يعتبره الكاتب إسهابًا زائدًا.

كلفة هذا النقص على Rust

الحل المعتاد في Rust هو تعريف بنية معاملات خاصة تُنفّذ `Default` مع إنهاء الاستدعاء بـ`..Default::default()`. ويرى الكاتب أن هذا أسوأ من أسلوب TypeScript: فالأنواع ليست مجهولة، والقيم الافتراضية المختلفة عن افتراضي النوع تتطلب كتابة دالة كاملة، ولا ينجح الأسلوب إلا إذا كانت لكل المعاملات قيم افتراضية.

فمن أجل ثلاثة معاملات اختيارية — السعة ودالة التجزئة والمخصّص — لدى `HashMap` في المكتب القياسي ثمانية مُنشئات، منها `new` و`with_capacity` و`with_hasher` و`with_capacity_and_hasher` مع صيغ `_in`، ويزيد عدد الدوال أُسّيًا. والالتباس في الترتيب سهل أيضًا: ففي `fn print(text: &str, bold: bool, italics: bool, underline: bool)` يؤدي تبديل الوسيطين الثاني والثالث إلى جعل النص عريضًا دون أن يُلاحظ ذلك.

اقتراح الكاتب

يجعل مقترحه التسمية اختيارية عبر الكلمة المفتاحية `pub` قبل اسم المعامل: `fn print_labeled_measurement(pub value: i32, pub unit_label: char = 'm')`، فيمكن للمستدعي كتابة `print_labeled_measurement(value: 5)`. وتأتي الوسائط المسماة بعد الموضعية، لكن يمكن إعادة ترتيبها فيما بينها ومنحها قيمًا افتراضية: في دوال `const` يجب أن يكون التعبير ثابتًا، وفي الدوال العادية تُحسب القيمة الافتراضية عند الإنساخ. ويجوز للسمات استخدام معاملات مسماة، وعلى التطبيقات تكرار الأسماء نفسها، لكن لا يُسمح لدوال السمات بقيم افتراضية. أما مؤشرات الدوال وسمات `Fn` فتبقى موضعية.

مقترحات أخرى وأسئلة مفتوحة

يستعرض الكاتب أيضًا مقترحات يراها أضعف: القيم الافتراضية لحقول البُنى (متاحة بالفعل في Nightly Rust، وقد كتب مكتبة polyfill باسم `feluments`)، والسجلات البنيوية التي رأى فريق اللغة صعوبتها الشديدة، ومقترح pre-RFC طويل من منتدى Rust Internals اقترح التحميل الزائد بدل القيم الافتراضية، والصيغة التي تبدأ بنقطة (مقترح RFC من عام 2020 لم يُدمج)، ونسخ أسلوب C#. ولأن الأسماء اختيارية، تبقى السلامة مسألة انضباط؛ ويقترح الكاتب أداة Clippy أو إلزام الأسماء في إصدار مستقبلي. وتبقى مفتوحة أسئلة الترتيب، واختيار `pub`، وما إذا كان يجب أن تكون القيم الافتراضية دائمًا `const`.

SSiTech

SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي

نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.