English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

نوع Rust Slice (قطعة)

قطعة (Slice) هو استناد جزئي إلى قيمة البيانات.

عادةً ما يظهر اسم "قطعة" في الدروس البيولوجية، عندما نقوم بتحضير قطع من الكائن الحي للاستخدام تحت المجهر. في Rust، يعني هذا تقريبًا نفس الشيء، ولكن يأخذ منه استنادًا إلى البيانات.

تقطيع النصوص

أبسط وأكثر أنواع التقطيع استخدامه هو تقطيع النصوص (String Slice).

fn main() {
    let s = String::from("broadcast");
    let part1 = &s[0..5];
    let part2 = &s[5..9];
    println!("{}={}+{}", s, part1, part2);
}

نتائج التنفيذ:

broadcast=broad+cast

الشكل المقدم يوضح مبادئ تقطيع النصوص (ملاحظة: نوع النص في Rust يُسجل في الواقع الموقع الأول للكاراكتر في الذاكرة ومدته، ونحن نعلم هذا الآن).

قواعد استخدام .. للنطاقات تم ذكرها في فصل الدورات.x..y يعني [x, y) المعنى الرياضياتي. .. يمكن أن تكون بدون أرقام على الجانبين:

..y تساوي 0..y
x.. تساوي موقع x إلى نهاية البيانات
.. تساوي موقع 0 إلى النهاية

ملاحظة:حتى الآن، حاول ألا تستخدم علامات غير إنجليزية في النصوص، بسبب مشاكل الترميز. السبب المفصل سيُذكر في فصل "النصوص".

يُمنع تغيير قيمة النص المُستخدم في التقطيع:

fn main() {
    let mut s = String::from("w3codebox");
    let slice = &s[0..3];
    s.push_str("yes!"); // خطأ
    println!("slice = {}", slice);
}

هذا البرنامج غير صحيح.

s تم استيراد جزء منه، ويُمنع تغيير قيمته.

في الواقع، حتى الآن، يجب أن تكون متساءلاً لماذا يجب دائمًا كتابة String::from("w3codebox") عند استخدام النصوص، يمكن كتابتها مباشرة "w3codebox" لا يمكن؟

إلى هنا يجب أن نفرق بين مفهومي الاثنين. هناك نوعان شائعان من أنواع النصوص في Rust: str و String. str هو نوع لغة قلب Rust، وهو قطع نصي (String Slice) الذي نتحدث عنه في هذا الفصل، وغالبًا ما يظهر كمرجع (reference) &str.

كل النصوص المحددة بدواليقلة المزدوجة لها طبيعة نوع كاملة &str:

let s = "hello";

هذا هو متغير نوع &str.

نوع String هو نوع بيانات يقدمه مكتبة القاعدة Rust، وله وظائف أكثر تطورًا - يدعم إضافة النصوص، وإزالة النصوص وما إلى ذلك من العمليات المفيدة. بالإضافة إلى خاصية بداية النص والطول النصي، يتمتع String و str بخصائص أخرى مثل الحجم (capacity).

يدعم كلا String و str عمليات القطع، ونتيجة القطع هي بيانات نوع &str.

ملاحظة: يجب أن يكون نتيجة القطع نوع مرجع، ولكن يجب على المطورين التأكيد على ذلك:

let slice = &s[0..3];

هناك طريقة سريعة لتحويل String إلى &str:

let s1 = String::from("hello");
let s2 = &s1[..];

قطع غير نصي

إضافة إلى الأنواع الخطية الأخرى مثل الأنواع النصية، تدعم بعض الأنواع الخطية عمليات القطع، مثل المجموعات:

fn main() {
    let arr = [1, 3, 5, 7, 9];
    let part = &arr[0..3];
    for i in part.iter() {
        println!("{}", i);
    }
}

نتائج التنفيذ:

1
3
5