[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-learn-rust-ep8-borrowing-and-references-all--*":3,"academy-blog-translations-k2bmf1p6o6kvw2q":73},{"data":4,"page":72,"perPage":72,"totalItems":72,"totalPages":72},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":65,"keywords":66,"locale":41,"published_at":67,"scheduled_at":13,"school_blog":63,"short_description":68,"slug":69,"status":61,"title":70,"updated":71,"updated_by":13,"views":64},"ตัวอย่างการใช้ Reference และ Borrow Checker","sclblg987654321","school_blog_translations","\u003Cp>ยินดีต้อนรับเพื่อนๆ ชาว Dev เข้าสู่ \u003Ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fcategories\u002FRust%20The%20Series\">\u003Cstrong>Rust The Series\u003C\u002Fstrong>\u003C\u002Fa> ครับ! ใน EP.7 เราได้เห็นความเฮี้ยน (แต่ปลอดภัย) ของกฎ \u003Cstrong>Ownership\u003C\u002Fstrong> ไปแล้ว ที่พอย้ายค่า (Move) ปุ๊บ ตัวแปรเดิมก็ตายทันที จนหลายคนอาจจะเริ่มท้อแล้วสงสัยว่า:\u003C\u002Fp>\u003Cblockquote>\u003Cp>\u003Cem>\"โหยพี่... ถ้าผมแค่จะส่งค่าไปให้ฟังก์ชันอ่านเฉยๆ ผมต้องมานั่ง \u003Ccode>.clone()\u003C\u002Fcode> ให้เสีย Memory หรือต้องคอย return ค่ากลับมาคืนเจ้าของเดิมทุกรอบเลยเหรอ?\"\u003C\u002Fem>\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>คำตอบคือ \u003Cstrong>\"ไม่ต้องครับ!\"\u003C\u002Fstrong> เพราะ Rust มีระบบที่เรียกว่า \u003Cstrong>Borrowing (การยืม)\u003C\u002Fstrong> ผ่านสิ่งที่เรียกว่า \u003Cstrong>References (&amp;)\u003C\u002Fstrong> ที่จะช่วยให้ชีวิตเราง่ายขึ้นเยอะ\u003C\u002Fp>\u003Ch2>1. การยืมแบบอ่านอย่างเดียว (Immutable References)\u003C\u002Fh2>\u003Cp>การยืมใน Rust เปรียบได้กับการยืมหนังสือจากห้องสมุดครับ:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>คุณเอาไปอ่านได้ (Access data)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>แต่คุณไม่ใช่เจ้าของ (No Ownership)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>และที่สำคัญคือ \u003Cstrong>คุณห้ามขีดเขียนหรือแก้ไขเนื้อหาในหนังสือเล่มนั้นเด็ดขาด!\u003C\u002Fstrong>\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>ในภาษา Rust เราจะใช้เครื่องหมาย \u003Cstrong>\u003Ccode>&amp;\u003C\u002Fcode>\u003C\u002Fstrong> นำหน้าชื่อตัวแปร เพื่อบอกคอมไพเลอร์ว่า \u003Cem>\"นี่คือการส่งแบบอ้างอิง (Reference) นะ ผมแค่ให้ยืมไปดู ไม่ได้ยกสิทธิ์เจ้าของให้\"\u003C\u002Fem>\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\r\n    let s1 = String::from(\"Superdev\");\r\n\r\n    \u002F\u002F ส่งแบบ &amp;s1 คือการ \"ให้ยืมอ่าน\"\r\n    let len = calculate_length(&amp;s1); \r\n\r\n    \u002F\u002F ✅ s1 ยังใช้งานได้ปกติ! เพราะสิทธิ์ความเป็นเจ้าของยังอยู่ที่นี่\r\n    println!(\"ความยาวของ '{}' คือ {}\", s1, len); \r\n}\r\n\r\nfn calculate_length(s: &amp;String) -&gt; usize { \u002F\u002F รับพารามิเตอร์เป็น Reference (&amp;)\r\n    s.len()\r\n} \u002F\u002F พอจบฟังก์ชัน s ซึ่งเป็น \"ผู้ยืม\" จะหลุด Scope ไป \r\n  \u002F\u002F แต่ข้อมูลจริงใน Memory ไม่โดนลบ เพราะ s ไม่ใช่เจ้าของตัวจริง\r\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cblockquote>\u003Cp>\u003Cstrong>💡 Pro Tip:\u003C\u002Fstrong> สังเกตไหมครับว่าตอนเรียกใช้ \u003Ccode>calculate_length(&amp;s1)\u003C\u002Fcode> เราต้องใส่ \u003Ccode>&amp;\u003C\u002Fcode> และที่ตัวรับในฟังก์ชัน \u003Ccode>(s: &amp;String)\u003C\u002Fcode> ก็ต้องใส่ \u003Ccode>&amp;\u003C\u002Fcode> เช่นกัน เพื่อเป็นการตกลงกันทั้งคนให้และคนรับว่า \u003Cstrong>\"นี่คือการยืมนะ\"\u003C\u002Fstrong>\u003C\u002Fp>\u003C\u002Fblockquote>\u003Ch2>2. เมื่ออยากแก้ไข ต้องยืมแบบ Mutable (&amp;mut)\u003C\u002Fh2>\u003Cp>ถ้าการยืมแบบปกติคือการขอยืมไปอ่าน การยืมแบบ Mutable Reference ก็คือการขอยืมไปแก้ไขครับ\u003C\u002Fp>\u003Cp>เปรียบเหมือนคุณยืมหนังสือจากเพื่อนมา แล้วขออนุญาตเพื่อนว่า \u003Cem>\"นายๆ เราขอจดโน้ตเพิ่มลงไปในหนังสือหน่อยนะ\"\u003C\u002Fem> ซึ่งเพื่อนจะอนุญาตได้ ก็ต่อเมื่อตัวเพื่อนเอง (เจ้าของ) ยอมให้หนังสือนั้นถูกขีดเขียนได้ตั้งแต่แรก\u003C\u002Fp>\u003Cp>ใน Rust เราจะใช้เครื่องหมาย \u003Cstrong>\u003Ccode>&amp;mut\u003C\u002Fcode>\u003C\u002Fstrong> แต่มีเงื่อนไขสำคัญคือ: \u003Cstrong>ตัวแปรต้นทางต้องถูกประกาศเป็น \u003Ccode>mut\u003C\u002Fcode> ไว้ตั้งแต่แรกด้วย\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\r\n    \u002F\u002F 1. ต้นทางต้องเป็น mut ถึงจะให้คนอื่นยืมไปแก้ได้\r\n    let mut s = String::from(\"Hello\");\r\n\r\n    \u002F\u002F 2. ตอนส่ง ต้องใส่ &amp;mut เพื่อยืนยันว่า \"ให้ยืมไปแก้\"\r\n    change(&amp;mut s); \r\n\r\n    println!(\"{}\", s); \u002F\u002F ผลลัพธ์จะเป็น \"Hello, Superdev\"\r\n}\r\n\r\nfn change(some_string: &amp;mut String) { \u002F\u002F 3. ตัวรับต้องระบุว่าเป็น &amp;mut String\r\n    some_string.push_str(\", Superdev\");\r\n}\r\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cblockquote>\u003Cp>\u003Cstrong>⚠️ ข้อควรระวัง:\u003C\u002Fstrong> แม้จะยืมไปแก้ได้ แต่ Rust ใจร้ายกว่าเพื่อนคุณครับ เพราะเขากำหนดว่า \u003Cstrong>\"ในเวลาเดียวกัน คุณจะให้คนยืมไปแก้ (&amp;mut) ได้แค่คนเดียวเท่านั้น\"\u003C\u002Fstrong> (ห้ามรุมแก้พร้อมกัน) เดี๋ยวเราจะไปดูเหตุผลกันในหัวข้อถัดไปครับ\u003C\u002Fp>\u003C\u002Fblockquote>\u003Ch2>3. กฎเหล็กของการยืม (The Rules of Borrowing)\u003C\u002Fh2>\u003Cp>เพื่อให้เกิดความปลอดภัยสูงสุดและป้องกันฝันร้ายของโปรแกรมเมอร์ที่เรียกว่า \u003Cstrong>Data Race\u003C\u002Fstrong> (การที่ข้อมูลถูกแก้ไขพร้อมกันจนพัง) Rust จึงตั้งกฎเหล็กที่คอมไพเลอร์จะตรวจยิบ 2 ข้อครับ:\u003C\u002Fp>\u003Ch3>กฎข้อที่ 1: จะอ่านกี่คนก็ได้ แต่ถ้าจะแก้... ต้องแก้คนเดียว\u003C\u002Fh3>\u003Cp>ในเวลาเดียวกัน คุณสามารถถือ Reference ได้เพียง \u003Cstrong>1 ใน 2 แบบนี้เท่านั้น\u003C\u002Fstrong>:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>มี \"คนยืมอ่าน\" (\u003Ccode>&amp;\u003C\u002Fcode>) กี่คนก็ได้\u003C\u002Fstrong> (ไม่จำกัดจำนวน) — เหมือนการอ่านวิกิพีเดีย ใครจะอ่านพร้อมกันก็ได้ ข้อมูลไม่เปลี่ยน\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>หรือ มี \"คนยืมแก้\" (\u003Ccode>&amp;mut\u003C\u002Fcode>) ได้เพียง \"คนเดียว\" เท่านั้น!\u003C\u002Fstrong> — และในช่วงที่คนนี้แก้ ห้ามมีคนอื่นแอบอ่านด้วยนะ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch3>กฎข้อที่ 2: Reference ต้องไม่ตายก่อนเจ้าของ (No Dangling References)\u003C\u002Fh3>\u003Cp>คุณจะยืมของจากคนที่หายตัวไปแล้วไม่ได้ ตัวแปรที่ยืมไปใช้จะต้องมั่นใจว่าเจ้าของข้อมูลจริงยังมีชีวิตอยู่ในหน่วยความจำตลอดช่วงเวลาที่ถูกยืม\u003C\u002Fp>\u003Cp>\u003Cstrong>ลองมาดูตัวอย่างที่คอมไพเลอร์จะด่าเราอย่างแรงครับ:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\r\n    let mut s = String::from(\"hello\");\r\n\r\n    let r1 = &amp;s;     \u002F\u002F ✅ ยืมอ่าน คนที่ 1 (ผ่าน)\r\n    let r2 = &amp;s;     \u002F\u002F ✅ ยืมอ่าน คนที่ 2 (ผ่าน)\r\n    \r\n    \u002F\u002F ❌ ERROR! คอมไพเลอร์จะเบรกทันที\r\n    let r3 = &amp;mut s; \r\n\r\n    println!(\"{}, {}, and {}\", r1, r2, r3);\r\n}\r\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>ทำไมถึงไม่ได้?\u003C\u002Fh3>\u003Cp>ลองจินตนาการว่า \u003Ccode>r1\u003C\u002Fcode> และ \u003Ccode>r2\u003C\u002Fcode> กำลังอ่านเนื้อหาในกระดาษอย่างตั้งใจ แล้วจู่ๆ \u003Ccode>r3\u003C\u002Fcode> ก็เดินมาเอาปากกาขีดฆ่าข้อความทิ้งต่อหน้าต่อตา! สิ่งที่ \u003Ccode>r1\u003C\u002Fcode> และ \u003Ccode>r2\u003C\u002Fcode> อ่านอยู่ก็จะไม่ถูกต้องทันที\u003C\u002Fp>\u003Cp>Rust เลยตัดไฟแต่ต้นลมว่า: \u003Cstrong>\"ถ้ามีคนอ่านอยู่ ห้ามใครมาแก้\"\u003C\u002Fstrong> และ \u003Cstrong>\"ถ้ามีคนแก้ ก็ห้ามคนอื่นอ่าน\"\u003C\u002Fstrong> เพื่อรับประกันว่าข้อมูลที่คุณถืออยู่ในมือนั้นถูกต้อง 100% เสมอครับ\u003C\u002Fp>\u003Ch2>4. ประโยชน์ของการ Borrowing\u003C\u002Fh2>\u003Cp>หลายคนอาจจะบ่นว่ากฎเยอะจังพี่! แต่เชื่อเถอะครับว่าถ้าคุณผ่านมันไปได้ สิ่งที่คุณจะได้กลับมาคือ Code ที่มีคุณภาพระดับโลก:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>🚀 \u003Cstrong>Performance ที่แรงสุดขีด:\u003C\u002Fstrong> เพราะเราไม่ต้องเสียเวลาและทรัพยากรไปกับการ Copy หรือ \u003Ccode>.clone()\u003C\u002Fcode> ข้อมูลขนาดใหญ่บน Heap Memory ทุกครั้งที่ส่งเข้าฟังก์ชัน การใช้ Reference ก็แค่การส่ง \"ที่อยู่\" (Pointer) สั้นๆ ซึ่งทำงานได้เร็วมาก\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>🛡️ \u003Cstrong>Safety ระดับสูงสุด:\u003C\u002Fstrong> ระบบ \u003Cstrong>Borrow Checker\u003C\u002Fstrong> ของคอมไพเลอร์จะตรวจความปลอดภัยให้เราตั้งแต่ตอนเขียน ไม่ต้องรอไปลุ้นให้โปรแกรม Crash ตอนรัน (Runtime) มั่นใจได้ว่าไม่มีใครแอบแก้ข้อมูลตัดหน้ากันแน่นอน\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>💎 \u003Cstrong>Clean Code &amp; Better DX:\u003C\u002Fstrong> โค้ดของคุณจะอ่านง่ายและเป็นธรรมชาติมากขึ้น ไม่ต้องเขียนฟังก์ชันแปลกๆ ที่ต้องคอย return ค่าเดิมกลับมาเพียงเพื่อรักษา Ownership ให้วุ่นวาย\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>สรุป\u003C\u002Fh2>\u003Cp>ระบบ Borrowing คือหัวใจที่ทำให้ Rust ใช้งานได้จริงและทรงพลังครับ แม้กฎจะดูจุกจิกในช่วงแรก แต่ถ้าคุณเริ่มจับจังหวะได้ว่า \"ใครคือเจ้าของ\" และ \"ใครเป็นแค่คนยืม\" คุณจะพบว่าตัวเองกำลังเขียนโปรแกรมที่เร็วระดับเทพ ปลอดภัยจากการจารกรรมข้อมูลใน Memory และที่สำคัญคือ \"Memory ไม่รั่วเลยแม้แต่ไบต์เดียว\" โดยไม่ต้องง้อ Garbage Collector เลยครับ!\u003C\u002Fp>\u003Cp>📌 \u003Cstrong>ใน EP. ถัดไป (EP.9):\u003C\u002Fstrong> เราจะไปลุยกันต่อกับเรื่อง Slices ซึ่งเป็นการยืมตข้อมูลเพียงบางส่วนมาใช้งาน (เช่น จะเอาแค่คำแรกในประโยคยาวๆ ต้องทำยังไง?) เรื่องนี้จะช่วยให้คุณจัดการ Array และ String ได้แบบโปรเฟสชันนอลยิ่งขึ้น... แล้วเจอกันครับ 🦀✨\u003C\u002Fp>\u003Cp>🎯 \u003Cstrong>ติดตามความรู้สาย Dev แบบสุดจัดได้ที่:\u003C\u002Fstrong> ไม่อยากพลาดบทความเทคนิคเชิงลึกและอัปเดตใหม่ๆ จากทีมงาน \u003Cstrong>Superdev Academy\u003C\u002Fstrong> ติดตามเราได้ทุกช่องทางที่นี่ครับ:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>Superdev Academy Thailand\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(อัปเดตข่าวสารและบทความใหม่)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 YouTube: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\">\u003Cstrong>Superdev Academy Channel\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(ติวเข้มแบบวิดีโอ)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(เกร็ดความรู้สั้นๆ และเบื้องหลังการทำงาน)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(Tips &amp; Tricks ฉบับย่อยง่าย)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"http:\u002F\u002Fsuperdevacademy.com\">\u003Cstrong>superdevacademy.com\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(คลังบทความและคอร์สเรียนฉบับเต็ม)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>","15bz1neqdh7h_j3kac2vebu.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fcwyiyxtlowoqqmm\u002F15bz1neqdh7h_j3kac2vebu.png","2026-04-27 03:03:56.300Z","",{"keywords":15,"locale":35,"school_blog":45},[16,22,26,30],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":19,"updated_by":13},"sclkey987654321","school_keywords","2026-04-27 03:00:35.773Z","zqd02oa08lbb7oz","สอนภาษา Rust",{"collectionId":17,"collectionName":18,"created":23,"created_by":13,"id":24,"name":25,"updated":23,"updated_by":13},"2026-04-27 03:00:57.235Z","e48382bzq7x36ct","Rust Borrowing",{"collectionId":17,"collectionName":18,"created":27,"created_by":13,"id":28,"name":29,"updated":27,"updated_by":13},"2026-04-27 03:01:05.258Z","qtnolt9tk6qjebz","References",{"collectionId":17,"collectionName":18,"created":31,"created_by":13,"id":32,"name":33,"updated":34,"updated_by":13},"2026-03-04 08:20:06.235Z","254619mvnk1hr7y","Rust","2026-04-10 16:07:25.292Z",{"code":36,"collectionId":37,"collectionName":38,"created":39,"flag":40,"id":41,"is_default":42,"label":43,"updated":44},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":46,"collectionId":47,"collectionName":48,"expand":49,"id":63,"views":64},"mfqe235iv6x1or8","pbc_2105096300","school_blogs",{"category":50},{"blogIds":51,"collectionId":52,"collectionName":53,"created":54,"created_by":13,"id":46,"image":55,"image_alt":13,"image_path":56,"label":57,"name":58,"priority":59,"publish_at":60,"scheduled_at":13,"status":61,"updated":62,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-16 04:40:07.104Z","47vt5s1gglj_tz0b90vnge.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fmfqe235iv6x1or8\u002F47vt5s1gglj_tz0b90vnge.png",{"en":58,"th":58},"Rust The Series",2,"2026-03-16 04:40:09.199Z","published","2026-04-25 02:32:15.619Z","k2bmf1p6o6kvw2q",178,"cwyiyxtlowoqqmm",[20,24,28,32],"2026-04-27 03:20:29.274Z","เรียนรู้วิธีการใช้งาน Borrowing และ References ในภาษา Rust เพื่อส่งค่าข้อมูลโดยไม่ต้องโอนสิทธิ์ Ownership พร้อมอธิบายกฎการยืมแบบอ่านอย่างเดียว (&) และการยืมแบบแก้ไขได้ (&mut) เพื่อความปลอดภัยของหน่วยความจำ","learn-rust-ep8-borrowing-and-references","การใช้งาน Borrowing และ References (การยืมข้อมูล) | Rust The Series EP.8","2026-04-27 03:20:29.275Z",1,{"th":69,"en":69}]