การส่งค่าเทียบกับการส่งข้อมูลอ้างอิง
อาร์กิวเมนต์ไปถึงฟังก์ชันของคุณได้อย่างไร
การส่งค่าเทียบกับการส่งข้อมูลอ้างอิง เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
อาร์กิวเมนต์เดินทางอย่างไร
เมื่อคุณเรียกฟังก์ชัน Zig ต้องนำข้อมูลของคุณเข้าไปภายในฟังก์ชัน มีอยู่สองวิธี คือส่งค่าไปโดยตรง หรือส่งการอ้างอิงไปยังค่านั้น 🚚
การส่งแบบค่าเป็นการคัดลอก
โดยปริยาย อาร์กิวเมนต์ชนิดพื้นฐานจะถูกส่งตามค่า ฟังก์ชันจะได้รับสำเนาของตัวเองและไม่สามารถเปลี่ยนค่าต้นฉบับของคุณได้
fn addOne(n: i32) i32 {
return n + 1;
}สำเนาแยกจากกันอย่างอิสระ
เนื่องจากเป็นสำเนา การแก้ไขภายในฟังก์ชันจึงไม่กระทบผู้เรียก ตัวแปรภายนอกของคุณยังคงเหมือนเดิมทุกประการ
พารามิเตอร์เปลี่ยนแปลงไม่ได้
พารามิเตอร์ของฟังก์ชันใน Zig เป็นค่าที่เปลี่ยนแปลงไม่ได้ คุณไม่สามารถกำหนดค่าใหม่ให้พารามิเตอร์ภายในส่วนตัวฟังก์ชันได้ ซึ่งช่วยให้เจตนาของโค้ดชัดเจน
ส่งพอยน์เตอร์เพื่อใช้ข้อมูลร่วมกัน
หากต้องการให้ฟังก์ชันเปลี่ยนข้อมูลของคุณ ให้ส่งพอยน์เตอร์ด้วย *T จากนั้นฟังก์ชันจะทำงานกับค่าจริงของคุณ ไม่ใช่สำเนา
fn bump(n: *i32) void {
n.* += 1;
}ยกเลิกการอ้างอิงเพื่อเข้าถึงค่า
ภายในฟังก์ชัน ให้ใช้ .* เพื่ออ่านหรือเขียนผ่านพอยน์เตอร์ n.* += 1 จะอัปเดตค่าที่ผู้เรียกยังถืออยู่
รับที่อยู่ด้วย &
ขณะเรียกฟังก์ชัน ให้ส่งที่อยู่โดยใช้ & จากนั้น bump(&count) จะทำให้ฟังก์ชันแก้ไข count ได้โดยตรง
var count: i32 = 0;
bump(&count); // count is now 1ข้อมูลขนาดใหญ่เหมาะกับการอ้างอิง
สำหรับโครงสร้างข้อมูลขนาดใหญ่ การคัดลอกสิ้นเปลืองโดยไม่จำเป็น การส่งพอยน์เตอร์คงที่ช่วยใช้ข้อมูลร่วมกันอย่างประหยัด โดยไม่อนุญาตให้แก้ไข
fn area(r: *const Rect) i32 {
return r.w * r.h;
}พอยน์เตอร์ const หมายถึงอ่านได้อย่างเดียว
*const T อนุญาตให้ฟังก์ชันอ่านข้อมูลของคุณ แต่ไม่สามารถเขียนข้อมูลนั้นได้ คุณจึงได้ความเร็วโดยไม่สูญเสียความปลอดภัย
สไลซ์เป็นมุมมองอยู่แล้ว
สไลซ์อย่าง []const u8 เก็บทั้งพอยน์เตอร์และความยาวไว้ จึงส่งต่อเพื่อใช้ข้อมูลต้นทางร่วมกันได้โดยไม่ต้องคัดลอกทั้งหมด
เลือกตามเจตนาการใช้งาน
ส่งตามค่าเมื่อข้อมูลมีขนาดเล็กและอ่านอย่างเดียว ส่งพอยน์เตอร์เมื่อจำเป็นต้องแก้ไขข้อมูลหรือเมื่อข้อมูลมีขนาดใหญ่
ตรวจสอบอย่างรวดเร็ว
คุณต้องการให้ฟังก์ชันเปลี่ยนตัวแปรของผู้เรียก รูปแบบพารามิเตอร์ใดทำให้ทำเช่นนั้นได้
ทบทวน
ค่าจะถูกคัดลอกและไม่สามารถเปลี่ยนค่าต้นฉบับของคุณได้ ส่วนพอยน์เตอร์ใช้ข้อมูลร่วมกัน ใช้ *T เพื่อแก้ไขข้อมูล และใช้ *const T เพื่ออ่านข้อมูลขนาดใหญ่ได้อย่างรวดเร็ว 🎯
คำถามที่พบบ่อย
บทเรียน “การส่งค่าเทียบกับการส่งข้อมูลอ้างอิง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การส่งค่าเทียบกับการส่งข้อมูลอ้างอิง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ไวยากรณ์ฟังก์ชันและชนิดค่าที่คืน
- การส่งค่าเทียบกับการส่งข้อมูลอ้างอิง
- ฟังก์ชัน pub และการมองเห็น
- การเรียกซ้ำและการคืนค่าหลายค่า