Thuta Learning
ရှာဖွေရန်
Rust
IntermediateProgrammingbeginner

Collections — `Vec<T>` နှင့် `HashMap<K, V>`

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Collections — `Vec<T>` နှင့် `HashMap<K, V>` concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • နမူနာ Rust code ကို ကိုယ်တိုင် run ပြီး output စစ်နိုင်ရန်
  • Tutorial Platform project နှင့် production scenario တွင် မှန်ကန်စွာအသုံးချနိုင်ရန်

နားလည်ထားရမယ့် အချက်

`Vec<T>` ဟာ Lesson 4 ရဲ့ fixed-size array နှင့်ဆန့်ကျင်ဖက်—runtime မှာ size ကြီးလာနိုင်တဲ့ growable, heap-allocated list ဖြစ်ပါတယ်—`push`/`pop` ဖြင့် element ထည့်/ဖြုတ် လုပ်နိုင်ပြီး element type အားလုံး တူညီရမယ်ဆိုတဲ့ constraint ရှိပါတယ်။ `HashMap<K, V>` ကတော့ key-value pair များကို hash function ကနေတစ်ဆင့် O(1) average-case lookup ပေးတဲ့ collection ဖြစ်ပြီး—key type က `Hash` trait implement ထားရမယ်ဆိုတဲ့ requirement ရှိပါတယ် (String, integer စတာတွေက default implement ထားပြီးသား)။ Value တစ်ခုကို `Vec`/`HashMap` ထဲ `push`/`insert` လုပ်လိုက်တဲ့အခါ Lesson 6 ရဲ့ ownership rule အတိုင်း—value ရဲ့ ownership က collection ဆီ move ဖြစ်သွားပါတယ်—original variable ကို ဆက်သုံးဖို့ ကြိုးစားရင် compile error ရနိုင်ပါတယ်၊ ဒါကြောင့် `.clone()` (deep copy, own copy ကို collection ထဲ ထည့်) သို့ borrow-based design (reference ကို collection ထဲ ထည့်၊ lifetime management ပိုအလုပ်များ) ကြားက tradeoff ကို ရွေးရပါတယ်။ `HashMap` ရဲ့ `entry` API (`map.entry(key).or_insert(0)`) ကတော့ key ရှိမရှိ check ပြီး default value insert လုပ်တဲ့ pattern ကို တစ်ကြောင်းတည်းနဲ့ ရေးနိုင်စေပါတယ်—word frequency counting လို use case တွေမှာ အလွန်အသုံးဝင်ပါတယ်။ Collection အားလုံးရဲ့ iterator (`for item in &vec`) ကို Lesson 7 ရဲ့ borrowing pattern အတိုင်း reference ဖြင့် iterate လုပ်လေ့ရှိပါတယ်—collection ကို consume (ownership take) မလုပ်ဘဲ read-only traverse လုပ်ချင်လို့ပါ။

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Content analyzer ရဲ့ lesson stats အားလုံးကို `let mut all_stats: Vec<LessonStat> = Vec::new();` ကနေစပြီး directory scan loop ထဲမှာ `all_stats.push(stat);` ဖြင့် accumulate မယ်—`push` တိုင်းက ownership ကို vector ဆီ move လုပ်ပေးလို့ loop variable ကို ဒီ push ပြီးနောက် ဆက်မသုံးတော့ပါ။ Tag frequency ကို ရေတွက်ချင်ရင် `HashMap<String, u32>` သုံးပြီး `*tag_counts.entry(tag.clone()).or_insert(0) += 1;` ဖြင့် ရေးမယ်—`entry` API က key ရှိပြီးသားလား, အသစ်ထည့်ရမလား decision ကို တစ်ကြောင်းတည်း ကိုင်တွယ်ပေးပါတယ်။ Report ကို final print ချင်ရင် `for stat in &all_stats { ... }` ဖြင့် reference iterate လုပ်မယ်—`all_stats` ကို ဒီ report loop ကနေနောက်မှာလည်း ထပ်သုံးဖို့ လိုအပ်နိုင်လို့ ownership မယူချင်ပါဘူး။

အတူတူ စမ်းရေးကြည့်မယ်

rust
use std::collections::HashMap;

fn main() {
    let mut all_titles: Vec<String> = Vec::new();
    all_titles.push(String::from("Ownership"));
    all_titles.push(String::from("Borrowing"));

    let mut tag_counts: HashMap<String, u32> = HashMap::new();
    for tag in ["rust", "ownership", "rust", "borrowing", "rust"] {
        *tag_counts.entry(tag.to_string()).or_insert(0) += 1;
    }

    println!("{all_titles:?}");
    println!("rust seen {} times", tag_counts["rust"]);
}
You should see
`["Ownership", "Borrowing"]` နှင့် "rust seen 3 times" ကို print ထုတ်နိုင်မည်။

၅ မိနစ် စမ်းကြည့်

String slice array တစ်ခု (word များ) ကနေ `HashMap<String, u32>` word-frequency counter ဆောက်ပါ—`entry` API ကို သုံးရမည်—ရလဒ်ကို frequency အများဆုံးမှ အနည်းဆုံးအထိ sort ပြီး print ထုတ်ပါ။

သတိလေးတစ်ချက်

Loop ထဲမှာ `String` variable တစ်ခုကို `Vec` ထဲ `push` လုပ်ပြီးနောက် ဒီ variable ကို ထပ်သုံးကြိုးစားခြင်း—ownership move ပြီးဖြစ်လို့ compile error "value borrowed after move" ရနိုင်ပါတယ်—clone() လိုအပ်ရင် သတိထားပါ။

`HashMap` ထဲက key ရှိမရှိ check မလုပ်ဘဲ `map[key]` ဖြင့် တိုက်ရိုက် access ခြင်း—key မရှိရင် runtime panic ဖြစ်ပါတယ်—`.get(key)` (Option ပြန်ပေး) ကို သုံးရင် safer ဖြစ်ပါတယ်။

Standard Library — CollectionsRust

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Loop ထဲမှာ `String` variable တစ်ခုကို `Vec` ထဲ `push` လုပ်ပြီးနောက် ဒီ variable ကို ထပ်သုံးကြိုးစားခြင်း—ownership move ပြီးဖြစ်လို့ compile error "value borrowed after move" ရနိုင်ပါတယ်—clone() လိုအပ်ရင် သတိထားပါ။
  • `HashMap` ထဲက key ရှိမရှိ check မလုပ်ဘဲ `map[key]` ဖြင့် တိုက်ရိုက် access ခြင်း—key မရှိရင် runtime panic ဖြစ်ပါတယ်—`.get(key)` (Option ပြန်ပေး) ကို သုံးရင် safer ဖြစ်ပါတယ်။
  • နမူနာ code ကို production system ပေါ် တိုက်ရိုက်မစမ်းဘဲ local/test environment တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

String slice array တစ်ခု (word များ) ကနေ `HashMap<String, u32>` word-frequency counter ဆောက်ပါ—`entry` API ကို သုံးရမည်—ရလဒ်ကို frequency အများဆုံးမှ အနည်းဆုံးအထိ sort ပြီး print ထုတ်ပါ။

You'll know it worked when: `["Ownership", "Borrowing"]` နှင့် "rust seen 3 times" ကို print ထုတ်နိုင်မည်။

Collections — `Vec<T>` နှင့် `HashMap<K, V>` | Thuta Learning