استنباط النوع

ستنظر Rust في كيفية استخدام المتغير لتحديد النوع:

fn takes_u32(x: u32) {
    println!("u32: {x}");
}

fn takes_i8(y: i8) {
    println!("i8: {y}");
}

fn main() {
    let x = 10;
    let y = 20;

    takes_u32(x);
    takes_i8(y);
    // takes_u32(y);
}
This slide should take about 3 minutes.

توضح هذه الشريحة كيف يستنتج مترجم Rust الأنواع بناءً على القيود المقدمة من انشاء المتغيرات (variable declarations) واستخداماتها.

من المهم جدًا التأكيد على أن المتغيرات المعلنة بهذه الطريقة ليست من نوع ديناميكي "أي نوع" يمكنه الاحتفاظ بأي بيانات. الكود الآلي الناتج عن هذا التصريح مطابق للتصريح الصريح عن النوع. يقوم المترجم بالعمل نيابة عنا ويساعدنا في كتابة كود أكثر اختصارًا.

عندما لا يوجد شيء يقيد نوع العدد الصحيح (integer literal)، فإن Rust تستخدم افتراضيًا i32. يظهر هذا أحيانًا كـ {integer} في رسائل الخطأ. وبالمثل، تستخدم الأعداد العشرية (floating-point literals) افتراضيًا f64.

fn main() {
    let x = 3.14;
    let y = 20;
    assert_eq!(x, y);
    // خطأ: لا يوجد تنفيذ لـ `{float} == {integer}`
}