နားလည်ထားရမယ့် အချက်
`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 မယူချင်ပါဘူး။
အတူတူ စမ်းရေးကြည့်မယ်
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"]);
}`["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 ဖြစ်ပါတယ်။