الشرائح كمعاملات للدوال
جزء من قسم 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"); // تمرير سلسلة نصية ثابتة مباشرةهذه المرونة تعني أن دوالك تعمل في حالات أكثر دون إجبار المستدعين على تحويل بياناتهم أو التخلي عن الملكية.
التحدي
سهلستتلقى مدخلين. المدخل الأول هو رسالة نصية، والمدخل الثاني هو الحد الأقصى للطول المسموح به للرسالة. قم بإنشاء دالة تسمى 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: قم بطباعة النتيجة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
تعبير 'match'مطابقة قيم متعددةمطابقة النطاقاتتعبير 'if let'الحلقات التكرارية كتعبيراتمراجعة - محلل أوامر بسيط4تجميع البيانات باستخدام Structs
ما هو الـ Struct؟نظرة عامة على الـ Structsالوصول إلى حقول الـ Structالـ Structs القابلة للتعديلالـ Structs كمعاملات للدوالالـ Tuple Structsمراجعة - إنشاء Book Struct7معالجة الأخطاء باستخدام 'Result'
ما هو 'Result'؟استخدام 'match' مع 'Result'is_ok() و is_err()اختصارات: unwrap و expectعامل علامة الاستفهام '?'تحويل السلاسل النصية إلى أرقامملخص - دالة القسمة الآمنة10الـ Closures والدوال المجهولة
ما هو الـ Closure؟تعريف Closure بسيطالـ Closures مع المعاملاتالتقاط البيئة المحيطةملخص - Closure الجامع البسيط2مقدمة في الـ Vectors
ما هو الـ Vector؟إنشاء Vectorإضافة عناصر باستخدام pushالوصول إلى عناصر الـ Vectorالتكرار عبر الـ Vectorالتكرار القابل للتعديل (Mutable Iteration)إزالة العناصرمراجعة - متتبع نقاط بسيط5أزواج (المفتاح والقيمة) مع Hash Maps
ما هو Hash Map؟إنشاء Hash Mapإدراج أزواج (المفتاح والقيمة)الوصول إلى القيمالتكرار عبر Hash Mapتحديث قيمةإزالة زوجملخص - عداد الكلمات6التعامل مع غياب القيم باستخدام 'Option'
ما هو الـ 'Option'؟استخدام 'match' مع 'Option''is_some()' و 'is_none()'فك تغليف الـ 'Option'الدالة 'expect'توفير قيمة افتراضية: 'unwrap_or'مراجعة - البحث عن عنصر9شرائح الـ String والمزيد
String مقابل &strإنشاء شرائح الـ Stringالشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى