0Pricing
Zig Academy · บทเรียน

โครงสร้างข้อมูล泛泛

รูปแบบฟังก์ชันที่คืนชนิดข้อมูล

โครงสร้างข้อมูล泛泛 เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชันที่รับชนิดข้อมูล
  2. โครงสร้างข้อมูล泛泛
  3. @TypeOf และการสะท้อนชนิดข้อมูล
  4. พารามิเตอร์ anytype
← กลับไปที่ Zig Academy