String مقابل &str
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 54 من 66.
تمتلك لغة Rust نوعين أساسيين من السلاسل النصية يخدمان أغراضاً مختلفة: String و &str. إن فهم الفرق بينهما أمر بالغ الأهمية للعمل بفعالية مع النصوص في Rust.
الـ String هي سلسلة نصية مملوكة (owned) ومخصصة في الذاكرة المكدسة (heap-allocated) يمكنك تعديلها. عندما تنشئ String، يمتلك برنامجك تلك البيانات ويكون مسؤولاً عن إدارة ذاكرتها. يمكنك زيادتها، وتقليصها، وتغيير محتوياتها لأنها قابلة للتغيير (mutable) عند التصريح عنها باستخدام mut.
let mut my_string = String::from("Hello");
my_string.push_str(" World"); // هذا يعمل لأن String مملوكة وقابلة للتغييرفي المقابل، تُعد &str (تُنطق "string slice") عرضاً مستعاراً وغير قابل للتغيير لبيانات السلسلة النصية. فهي لا تملك البيانات التي تشير إليها - بل هي مجرد مرجع لمحتوى نصي موجود في مكان آخر. سلاسل النصوص الثابتة (String literals) مثل "Hello" هي في الواقع من النوع &str.
let my_slice: &str = "Hello World"; // هذه شريحة سلسلة نصيةفكر في String كامتلاك كتاب يمكنك الكتابة فيه وتعديله، بينما &str يشبه استعارة كتاب شخص آخر - يمكنك قراءته، لكن لا يمكنك تغييره. هذا التمييز أساسي لنظام الملكية (ownership system) في Rust ويساعد في ضمان سلامة الذاكرة.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
ورقة مرجعية
تمتلك لغة Rust نوعين أساسيين من السلاسل النصية:
String- سلسلة نصية مملوكة (owned)، مخصصة في الذاكرة الحيوية (heap-allocated)، وقابلة للتعديل (mutable)&str- شريحة نصية مستعارة (borrowed)، غير قابلة للتعديل (immutable) (مرجع لبيانات السلسلة النصية)
إنشاء String:
let mut my_string = String::from("Hello");
my_string.push_str(" World");تعتبر السلاسل النصية الحرفية (String literals) من نوع &str:
let my_slice: &str = "Hello World";تمتلك String بياناتها ويمكن تعديلها، بينما &str هي مرجع لا يمكن تغييره.
جرّب بنفسك
لا يتضمّن هذا الدرس تحدّيًا برمجيًا.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى