English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

قواعد اللغة Rust

المتغيرات، الأنواع الأساسية، الدوال، التعليقات، والسيطرة على흐름، هذه هي تقريبًا المفاهيم البرمجية التي تحتويها كل لغة برمجة.

هذه المفاهيم الأساسية ستكون موجودة في كل برنامج Rust، ودراستها مبكرًا ستجعلك تتعلم استخدام Rust بسرعة.

المتغير

لا بد من توضيح أولاً أن Rust هو لغة برمجة قوية، ولكنه يمتلك القدرة على تحديد نوع المتغير تلقائيًا. هذا يمكن أن يخلق بعض الالتباس مع اللغات الضعيفة النوعية.

لإعلان المتغير، يجب استخدام كلمة المفتاح let. على سبيل المثال:

let a = 123;

المطورون الذين تعلموا فقط JavaScript يشعرون بشدة بهذا العنصر، بينما المطورون الذين تعلموا فقط C لا يفهمون هذا العنصر.

بعد هذه الجملة الاعلانية، تُمنع الثلاثة سطور التالية:

a = "abc";
a = 4.56; 
a = 456;

الخطأ في السطر الأول هو أن بعد إعلان a كعدد صحيح، يتم تحديد a كعدد صحيح، ولا يمكن assignment قيمة نوع نصي إليها.

الخطأ في السطر الثاني هو أن هناك خسارة في دقة التحويل التلقائي للعدد، لا يسمح Rust بتغيير أنواع البيانات التلقائي مع فقدان الدقة.

الخطأ في السطر الثالث هو أن a ليس متغيرًا قابلا للتغيير.

الخطأين الأولين يسهل فهمهما، ولكن ماذا يعني الخطأ الثالث؟ أليس a متغيرًا؟

هذا يدخل في تصميم Rust للتوازي الأمن العالي: تجنب تغيير قيمة المتغيرات قدر الإمكان على مستوى اللغة. لذا فإن قيمة a غير قابلة للتغيير. ولكن هذا لا يعني أن a ليست متغيرًا (variable) (باللغة الإنجليزية). وفقًا للوثائق الرسمية، يُدعى هذا النوع من المتغيرات متغيرات غير قابلة للتغيير.

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

بالطبع، جعل المتغيرات قابلة للتغيير (mutable) يتطلب فقط كلمة المفتاح mut.

let mut a = 123;
a = 456;

هذا البرنامج صحيح.

الفرق بين الثوابت والمتغيرات غير القابلة للتغيير

إذن، إذا كانت المتغيرات غير القابلة للتغيير غير قابلة للتغيير، فإنها ليست كالثوابت؟ لماذا يُدعى متغيرًا؟

هناك فرق بين المتغيرات والثوابت. في Rust، البرنامج التالي هو قانوني:}}

let a = 123;
let a = 456;

لكن إذا كان a ثابتًا فإنه غير قانوني:

const a: i32 = 123;
let a = 456;

يمكن "إعادة التخصيص" قيمة المتغير، ولكن لا يمكن تغييرها بشكل غير قانوني قبل "إعادة التخصيص"، مما يضمن أن يمكن للمعالج التفكير بشكل كامل في منطقة "التخصيص" بعد كل "تخصيص". على الرغم من أن Rust يحتوي على وظيفة تحديد النوع تلقائيًا، إلا أن هناك بعض الحالات حيث يكون تحديد النوع أكثر مرونة:

let a: u64 = 123;

هنا تم تعريف a كمتغير غير معتمد 64 بت، إذا لم يتم تعريف النوع، سيتم تحديد a تلقائيًا كمتغير معتمد 32 بت، مما يؤثر بشكل كبير على نطاق قيم a.

الإشارة (Shadowing)

مفهوم الإشارة مختلف عن "التحديد" (Override) أو "التشغيل المزدوج" (Overload) في لغات البرمجة الموجهة للأ�체ة الأخرى. الإشارة هي ما تم مناقشته من قبل كـ "إعادة التخصيص"، وتم استخدام الأقواس لتمثيل هذا المفهوم دون شرحه.

الإشارة تعني مبدأ يمكن استخدام اسم المتغير مرة أخرى:

fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("قيمة x هي: {}", x);
}

نتيجة تشغيل هذا البرنامج:

قيمة x هي: 12

الإشارة إلى نفس المتغير والمغيرات القابلة للتغيير ليست نفس المفهوم، الإشارة إلى نفس المتغير تعني استخدام نفس الاسم لتمثيل كيان متغير آخر، يمكن أن تتغير نوعه، خصائصه وقيمته. ولكن يمكن أن تتغير قيمة المتغير القابل للتغيير فقط.

let mut s = "123";
s = s.len();

هذا البرنامج سيكون فيه خطأ: لا يمكن إسناد قيمة كاملة إلى متغير نصي.