ข้ามไปยังเนื้อหา

Collections

Array, Object และ Map ของ JavaScript ครอบคลุมความต้องการด้าน collection เกือบทั้งหมด Rust มีตัวเทียบเท่าโดยตรงพร้อมความแตกต่างสำคัญหนึ่งข้อ: collection เป็นแบบ มี type และ element แบบตายตัวVec<i32> เก็บได้เฉพาะค่า i32 และ compiler บังคับเรื่องนี้

Vec<T> คือ array ที่ขยายได้และจองบน heap ของ Rust เทียบเท่ากับ array ของ JS (เมื่อทุก element มี type เดียวกัน) สร้างได้ด้วย macro vec! หรือ Vec::new()

array ขนาดคงที่ [T; N] อยู่บน stack ส่วน tuple (T1, T2, ...) เก็บค่าที่ต่างชนิดกัน — คล้ายกับ tuple type ของ TypeScript

HashMap<K, V> คือของเทียบเท่า Map ของ JS หรือ Record<string, V> ของ TS โดยใน Rust จะอยู่ใน std::collections

iterator ของ Rust เป็นแบบ lazy และต่อกันได้ — filter, map, collect ใช้งานเหมือน array method ของ JS แต่จะประเมินผลก็ต่อเมื่อถูก consume เท่านั้น

TypeScript
// Array
const numbers = [1, 2, 3, 4, 5];
const odds = numbers.filter(x => x % 2 !== 0);
console.log(odds); // [1, 3, 5]
// Map
const scores = new Map<string, number>();
scores.set("Alice", 95);
scores.set("Bob", 87);
console.log(scores.get("Alice")); // 95
// Tuple (TypeScript)
const pair: [string, number] = ["Alice", 95];
Rust
use std::collections::HashMap;
fn main() {
// Vec
let numbers = vec![1, 2, 3, 4, 5];
let odds: Vec<i32> = numbers.iter()
.filter(|&&x| x % 2 != 0)
.copied()
.collect();
println!("{:?}", odds); // [1, 3, 5]
// HashMap
let mut scores: HashMap<&str, i32> = HashMap::new();
scores.insert("Alice", 95);
scores.insert("Bob", 87);
if let Some(s) = scores.get("Alice") {
println!("{s}"); // 95
}
// Tuple
let pair: (&str, i32) = ("Alice", 95);
println!("{} scored {}", pair.0, pair.1);
}
fn main() {
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let odds: Vec<i32> = numbers.iter().filter(|&&x| x % 2 != 0).copied().collect();
println!("Odd numbers: {:?}", odds);
let mut scores = std::collections::HashMap::new();
scores.insert("Alice", 95);
scores.insert("Bob", 87);
if let Some(s) = scores.get("Alice") {
println!("Alice scored {s}");
}
}
อะไรคือตัวเทียบเท่าของ array ที่ขยายได้แบบ JavaScript ใน Rust?
`.collect()` ทำอะไรเมื่ออยู่ท้าย iterator chain ของ Rust?
คุณเข้าถึง element ตัวที่สองของ tuple `t` ใน Rust อย่างไร?