English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
الوظائف موجودة بشكل واسع في لغة Rust.
من خلال الفصول السابقة يمكننا معرفة شكل الوظائف الأساسية في Rust:
fn <اسم_الوظيفة> ( <المعامل> ) <جسم_الوظيفة>
في Rust، نمط التسمية للوظائف هو استخدام حروف صغيرة مفصولة بالخط الفاصل _
fn main() { println!("مرحبًا، world!"); another_function(); } fn another_function() { println!("مرحبًا، w3codebox!"); }
نتيجة التشغيل:
مرحبًا، world! مرحبًا، w3codebox!
لاحظ أننا قمنا بتعريف another_function بعد دائرة main في الكود المصدر. Rust لا يهم أين تعريف الوظائف، فقط يجب أن يتم تعريفها في مكان ما.
في Rust، عند تعريف وظيفة تحتاج إلى امتلاك معامل يجب أن يتم تسمية المعامل و إعلان نوعه:
fn main() { another_function(5, 6); } fn another_function(x: i32, y: i32) { println!("قيمة x هي: {}", x); println!("قيمة y هي: {}", y); }
نتيجة التشغيل:
قيمة x هي: 5 قيمة y هي : 6
جسم الوظيفة في Rust يتكون من سلسلة من الجمل التي يمكن أن تنتهي بتعبير (Expression). حتى الآن، لم نرى وظيفة تنتهي بتعبير، لكننا استخدمنا التعبير كجزء من الجملة.
الجملة هي خطوة تنفيذ بعض العمليات وليس لها قيمة عائدة. على سبيل المثال:
let a = 6;
هذه الخطوة لا تعود أي قيمة، لذا الخطوة التالية غير صحيحة:
let a = (let b = 2);
التعبير يحتوي على خطوات حسابية وله قيمة عائدة. إليك تعبير (افتراضًا أن المسميات المتاحة تم تعريفها):
a = 7 b + 2 c * (a + b)
في Rust يمكن كتابة تعبير معقد داخل دائرة مفتوحة {}
fn main() { let x = 5; let y = { let x = 3; x + 1 }; println!("قيمة x هي: {}", x); println!("قيمة y هي: {}", y); }
نتيجة التشغيل:
قيمة x هي: 5 قيمة y هي: 4
من الواضح أن هذا البرنامج يحتوي على كتلة تعبيرية:
{ let x = 3; x + 1 };
لا يمكن وضع نقطة السطر بعد x + 1، وإلا سيصبح بيانًا!
الاشارة إلى
هذا التعبير هو جسم وظيفة صالح. وفي Rust، يمكن تعريف الوظائف بشكل متداخل:
fn main() { fn five() -> i32 { 5 } println!("قيمة five() هي: {}", five()); }
تم عرض طريقة إعلان نوع العودة للوظيفة في المثال المدمج السابق: باستخدام -> بعد إعلان المتغيرات لتحديد نوع العودة للوظيفة (ليس : ).
في جسم الوظيفة، يمكن استخدام كلمة المفتاح return في أي وقت للإنتهاء من تشغيل الوظيفة وإرجاع قيمة مناسبة. هذا هو أقرب شيء إلى تجربة معظم المطورين:
fn add(a: i32, b: i32) -> i32 { return a + b; }
لكن Rust لا يدعم التنبؤ تلقائيًا بنوع العودة للقيمة! إذا لم يتم تحديد نوع العودة للوظيفة بشكل صريح، فإن الوظيفة ستعتبر "عملية نظيفة"، ولن يُسمح لها بإنشاء قيمة العودة، لا يمكن وضع تعبير العودة بعد return. هذا الهدف هو جعل الوظائف العامة قابلة الرؤية.
الاشارة إلىجسد الوظيفة التعبيرية لا يمكن أن يكون مساوياً لجسد الوظيفة، لا يمكن استخدامه return الكلمات المفتاحية.