Array

ในภาษา Rust โครงสร้างข้อมูลแบบ Array จะมีความคล้ายคลึงกับ Array ในภาษา C หรือ C++ โดยมีข้อจำกัดดังต่อไปนี้:

  • ขนาดคงที่: เมื่อสร้างแล้วไม่สามารถเพิ่มหรือลดขนาดได้
  • ชนิดข้อมูลเดียวกัน: ข้อมูลที่เก็บต้องเป็นประเภทเดียวกันทั้งหมด

ตัวอย่างการใช้งาน Array

fn main() {
    let mut arr: [i32; 3] = [0, 0, 0];
    arr[1] = 5;
    let a = arr[1];
    println!("{:?}", arr);
    println!("{}", arr[0]);
    println!("{}", a);
}

คำถามให้ลองทำ

  • หากประกาศ let arr = [0; 3]; ผลลัพธ์จะเป็นอะไร?
  • จะประกาศ array ขนาด 10,000 ที่มีแต่ 'A' ได้อย่างไร

Tuple

Tuple ในภาษา Rust มีความคล้ายคลึงกับ Array แต่มีข้อแตกต่างที่ Tuple สามารถเก็บข้อมูลที่มีชนิดต่างกันได้

ตัวอย่างการใช้งาน Tuple

fn main() {
    let mut t:(u8, f64, char) = (1, 1.0, '1');

    t.0 = 2;
    t.1 = 3.3;
    t.2 = '5';

    let c = t.2;

    let (a, b, _) = t;

    println!("{:?}", t);
}

Vector

Vector คือโครงสร้างข้อมูลแบบ Array ที่สามารถเพิ่มหรือลดขนาดได้ เนื่องจากถูกเก็บอยู่ใน Heap Memory

note

การที่ข้อมูลถูกเก็บไว้ใน Heap ทำให้สามารถขจัดข้อจำกัดเรื่องขนาดได้ แต่มีผลกระทบต่อประสิทธิภาพเมื่อเทียบกับข้อมูลที่เก็บอยู่ใน Stack

note

vec![] คือ macro ที่ใช้สำหรับสร้าง Vector

ตัวอย่างการใช้งาน

fn main() {
    let mut a = vec![0; 10];
    a.push(1);
    println!("{}", a[10]);
    println!("{:?}", a);
    a.pop();
    println!("{:?}", a);
}

ลองแก้โค้ดดู

  • ลองประกาศ Array ของเลข 0 ทั้งหมด 10 ล้านตัวว่าจะเกิดอะไรขึ้น
  • ลองเปลี่ยนเป็นประกาศ Vector ของเลข 0 ทั้งหมด 10 ล้านตัว

note

ในภาษา Rust สามารถใช้ _ คั่นตัวเลขได้ เช่น let i:i32 = 10_000_000;

Slice

Slice เป็นการอ้างอิงถึงส่วนหนึ่งของข้อมูลที่มีอยู่แล้ว ซึ่งช่วยให้การเข้าถึงข้อมูลมีประสิทธิภาพและใช้หน่วยความจำน้อยลง เนื่องจากไม่ต้องทำการคัดลอกข้อมูล

note

ในภาษา JavaScript การใช้ .slice() จะเป็นการคัดลอกข้อมูล

ตัวอย่างการใช้ Slice

fn main() {
    let s:&str = "Hello World";
    let string:String = s.to_string();
    let slice:&str = &string[..5];

    let arr:[i32;5] = [1, 2, 3, 4, 5];
    let arr_slice:&[i32] = &arr[1..4];

    println!("{}", slice);
    println!("{:?}", arr_slice);
}