โครงสร้างข้อมูล泛泛
รูปแบบฟังก์ชันที่คืนชนิดข้อมูล
โครงสร้างข้อมูล泛泛 เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คอนเทนเนอร์เจเนริกใน Zig
หากต้องการให้โครงสร้างข้อมูลทำงานกับชนิดข้อมูลสมาชิกใด ๆ ให้เขียนฟังก์ชันที่รับชนิดข้อมูลและ ส่งคืน ชนิด struct ใหม่เอี่ยม 📦
ฟังก์ชันที่ส่งคืนชนิดข้อมูล
เคล็ดลับคือฟังก์ชันสามารถมีชนิดข้อมูลที่ส่งคืนเป็น type ได้ ฟังก์ชันจะคำนวณและส่งคืนชนิดข้อมูลใหม่ขณะคอมไพล์
fn List(comptime T: type) type {
return struct {};
}สร้าง struct ภายใน
ภายในฟังก์ชัน ให้กำหนด struct ที่ฟิลด์ใช้พารามิเตอร์ชนิดข้อมูล T การเรียกใช้แต่ละครั้งจะสร้าง struct ที่ปรับให้เหมาะกับชนิดข้อมูลสมาชิกนั้น
fn Box(comptime T: type) type {
return struct { value: T };
}ตั้งชื่อชนิดข้อมูลที่ได้
เรียกใช้ฟังก์ชันที่ส่งคืนชนิดข้อมูลและเก็บผลลัพธ์ไว้ใน const ตอนนี้คุณก็มีชนิดข้อมูลเฉพาะพร้อมใช้งานแล้ว
const IntBox = Box(i32);สร้างอินสแตนซ์
ใช้ชนิดข้อมูลที่ตั้งชื่อไว้เหมือน struct ใด ๆ ในที่นี้เราสร้าง Box ที่เก็บจำนวนเต็มสี่สิบสอง
const b = IntBox{ .value = 42 };เพิ่มเมธอดให้ struct ภายใน
struct ที่ส่งคืนสามารถมีเมธอดได้เช่นกัน เมธอดเหล่านั้นมองเห็นพารามิเตอร์ชนิดข้อมูล จึงยังเป็นเจเนริกอย่างสมบูรณ์
fn Box(comptime T: type) type {
return struct {
value: T,
fn get(self: @This()) T {
return self.value;
}
};
}เข้าถึงชนิดข้อมูลด้วย @This
ภายใน struct ที่ส่งคืนแบบไม่ระบุชื่อ คุณไม่สามารถตั้งชื่อ struct โดยตรงได้ เมธอดจึงใช้ @This() เพื่ออ้างถึงชนิด struct ที่ครอบอยู่
self: @This()ชนิดข้อมูลมากมายจากนิยามเดียว
เรียกใช้ฟังก์ชันด้วยชนิดข้อมูลต่างกัน แล้วคุณจะได้ struct ที่แตกต่างกัน Box(i32) และ Box(f64) เป็นชนิดข้อมูลแยกจากกันและผ่านการตรวจสอบอย่างสมบูรณ์
const FloatBox = Box(f64);นี่คือพลังเบื้องหลังไลบรารีมาตรฐาน
ArrayList และ HashMap ของ Zig เองก็สร้างด้วยวิธีนี้ทุกประการ นั่นคือฟังก์ชันที่รับชนิดข้อมูลและส่งคืนชนิดคอนเทนเนอร์ที่กำหนดค่าแล้ว
const Ints = std.ArrayList(i32);แก้ไขทั้งหมดขณะคอมไพล์
การสร้างชนิดข้อมูลทั้งหมดนี้เกิดขึ้นระหว่างการสร้างโปรแกรม ดังนั้นคอนเทนเนอร์เจเนริกจึงมี ต้นทุน เท่ากับคอนเทนเนอร์ที่เขียนขึ้นเอง
ส่งตัวจัดสรรหน่วยความจำเมื่อขยายขนาด
คอนเทนเนอร์ที่ขยายขนาดได้จะเก็บฟิลด์ ตัวจัดสรรหน่วยความจำ ซึ่งส่งเข้ามาตอนเริ่มต้น ทำให้ชนิดเจเนริกระบุอย่างชัดเจนว่าหน่วยความจำมาจากที่ใด
return struct {
items: []T,
alloc: std.mem.Allocator,
};ตรวจสอบอย่างรวดเร็ว
คุณต้องการสแตกเจเนริกที่ทำงานกับชนิดข้อมูลสมาชิกใด ๆ ใน Zig คุณจะใช้รูปแบบใด
สรุปทบทวน
เขียนฟังก์ชันที่รับ ชนิดข้อมูล และส่งคืนชนิด struct การเรียกใช้แต่ละครั้งจะได้คอนเทนเนอร์เฉพาะที่เป็นรูปธรรม นี่คือวิธีที่ std สร้างคอลเลกชันของตน 🎯
คำถามที่พบบ่อย
บทเรียน “โครงสร้างข้อมูล泛泛” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “โครงสร้างข้อมูล泛泛” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Zig Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “โครงสร้างข้อมูล泛泛”
รูปแบบฟังก์ชันที่คืนชนิดข้อมูล คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Zig Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Zig Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “โครงสร้างข้อมูล泛泛” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Zig Academy นี้ได้ไหม
ได้ บทเรียน Zig Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ