Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الشرائح كمعاملات للدوال

جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 56 من 66.

عند كتابة دوال تتعامل مع السلاسل النصية، فإن استخدام &str كنوع للمعامل بدلاً من String يجعل دوالك أكثر مرونة وفائدة بكثير.

الدالة التي تأخذ معامل String يمكنها فقط قبول السلاسل النصية المملوكة، مما يحد من كيفية استدعائها:

fn print_message(text: String) {
    println!("{}", text);
}

// هذا يعمل، لكنه يأخذ الملكية
let my_string = String::from("Hello");
print_message(my_string); // my_string لم تعد قابلة للاستخدام بعد ذلك

ومع ذلك، فإن الدالة التي تأخذ &str يمكنها قبول كل من مراجع String والسلاسل النصية الثابتة (string literals)، مما يجعلها أكثر مرونة بكثير:

fn print_message(text: &str) {
    println!("{}", text);
}

// يمكنك الآن استدعاؤها بأي من النوعين
let my_string = String::from("Hello");
print_message(&my_string); // تمرير مرجع إلى String
print_message("World");     // تمرير سلسلة نصية ثابتة مباشرة

هذه المرونة تعني أن دوالك تعمل في حالات أكثر دون إجبار المستدعين على تحويل بياناتهم أو التخلي عن الملكية.

challenge icon

التحدي

سهل

ستتلقى مدخلين. المدخل الأول هو رسالة نصية، والمدخل الثاني هو الحد الأقصى للطول المسموح به للرسالة. قم بإنشاء دالة تسمى truncate_message تأخذ شريحة نصية (&str) والحد الأقصى للطول (usize) كمعاملات. إذا تجاوز طول الرسالة الحد الأقصى، يجب أن تعيد الدالة شريحة من الرسالة حتى الحد الأقصى للطول. خلاف ذلك، يجب أن تعيد الرسالة بأكملها. اطبع النتيجة.

المتطلبات:

  • اقرأ المدخل الأول (الرسالة النصية) وقم بإزالة المسافات البيضاء
  • اقرأ المدخل الثاني (الحد الأقصى للطول) وقم بإزالة المسافات البيضاء
  • قم بتحويل الحد الأقصى للطول إلى usize
  • قم بتعريف دالة truncate_message تأخذ معاملين:
    • شريحة نصية &str للرسالة
    • usize للحد الأقصى للطول
  • داخل الدالة، تحقق مما إذا كان طول الرسالة أكبر من الحد الأقصى للطول
  • إذا كان الأمر كذلك، فقم بإرجاع شريحة من الرسالة من الفهرس 0 إلى الحد الأقصى للطول باستخدام &message[0..max_len]
  • إذا لم يكن الأمر كذلك، فقم بإرجاع الرسالة بأكملها
  • استدعِ الدالة مع رسالة المدخلات والحد الأقصى للطول
  • اطبع النتيجة المسترجعة

المدخلات:

  • السطر الأول: رسالة نصية (على سبيل المثال، Hello World from Rust)
  • السطر الثاني: الحد الأقصى للطول كرقم (على سبيل المثال، 11)

المخرجات:

  • الرسالة المقتطعة إذا تجاوزت الحد الأقصى للطول، أو الرسالة الكاملة بخلاف ذلك

ورقة مرجعية

إن استخدام &str كنوع للمعامل يجعل الدوال أكثر مرونة من استخدام String، حيث يمكنها قبول كل من مراجع السلاسل النصية والنصوص الحرفية:

fn print_message(text: &str) {
    println!("{}", text);
}

let my_string = String::from("Hello");
print_message(&my_string); // تمرير مرجع إلى String
print_message("World");     // تمرير نص حرفي مباشرة

لإرجاع شريحة (slice) من سلسلة نصية حتى طول معين، استخدم صيغة الشرائح (slice syntax):

&message[0..max_len]

جرّب بنفسك

use std::io;

// TODO: قم بتعريف الدالة truncate_message هنا


fn main() {
    // قراءة الرسالة النصية
    let mut message = String::new();
    io::stdin().read_line(&mut message).expect("Failed to read line");
    let message = message.trim();
    
    // قراءة الحد الأقصى للطول
    let mut max_length_input = String::new();
    io::stdin().read_line(&mut max_length_input).expect("Failed to read line");
    let max_len: usize = max_length_input.trim().parse().expect("Invalid number");
    
    // TODO: قم باستدعاء الدالة truncate_message وتخزين النتيجة
    
    // TODO: قم بطباعة النتيجة
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow