ข่าวประชาสัมพันธ์ได้ถูกเผยแพร่แล้ว สนิม 1.96.0 — เวอร์ชันเสถียรล่าสุดของภาษาโปรแกรม Rust การอัปเดตได้ถูกปล่อยออกมาแล้ว 28 พฤษภาคม 2026 ปีสามารถติดตั้งได้โดยใช้คำสั่ง rustup update stable มาตรฐาน การเปลี่ยนแปลงหลักๆ ได้แก่ ประเภทช่วงใหม่ใน core::range การทำให้มาโครการจับคู่รูปแบบมีเสถียรภาพมากขึ้น การปรับปรุงพฤติกรรมการสร้าง WebAssembly ให้รัดกุมยิ่งขึ้น และการแก้ไขช่องโหว่สองรายการใน Cargo
การเปลี่ยนแปลงที่สำคัญ
ประเภทช่วงใหม่ core::range::Range*.
ประเภทช่วงใหม่ได้รับการกำหนดให้เสถียรในไลบรารีมาตรฐานแล้ว ได้แก่ core::range::Range, RangeFrom, RangeInclusive และตัววนซ้ำที่เกี่ยวข้อง แตกต่างจากประเภทเก่าจาก core::ops ประเภทช่วงใหม่เหล่านี้ไม่ได้ใช้งานอินเทอร์เฟซ Iterator โดยตรง แต่จะถูกแปลงเป็นตัววนซ้ำผ่าน IntoIterator ซึ่งทำให้ช่วงเหล่านี้สามารถคัดลอกได้ สะดวก เช่น เมื่อต้องการจัดเก็บช่วงเป็นฟิลด์ในโครงสร้าง ไวยากรณ์เช่น 0..1 ในปัจจุบันสร้างประเภทช่วงแบบเก่า แต่มีแผนที่จะย้ายไปใช้ประเภทใหม่ในเวอร์ชันถัดไปของภาษาเพิ่ม assert_matches! และ debug_assert_matches! แล้ว
มาโครใหม่ช่วยให้คุณตรวจสอบว่าค่าตรงกับรูปแบบที่กำหนดหรือไม่ แนวคิดนี้คล้ายกับ assert!(matches!(…)) แต่ในกรณีที่เกิดข้อผิดพลาด จะมีการพิมพ์ค่าในรูปแบบดีบักออกมา ทำให้การวินิจฉัยง่ายขึ้น มาโครเหล่านี้ไม่ได้ถูกเพิ่มเข้าไปใน Prelude เพื่อหลีกเลี่ยงความขัดแย้งกับไลบรารีภายนอกที่เป็นที่นิยม ดังนั้นจึงต้องนำเข้าอย่างชัดเจนจาก core หรือ stdเปลี่ยนแปลงพฤติกรรมของเป้าหมาย WebAssembly แล้ว
Rust จะไม่ส่งค่า --allow-undefined ไปยัง linker สำหรับการสร้าง WebAssembly อีกต่อไปแล้ว สัญลักษณ์ที่ไม่ถูกกำหนดจะถูกมองว่าเป็นข้อผิดพลาดระหว่างการเชื่อมโยง แทนที่จะถูกแปลงเป็นการนำเข้าจากโมดูล "env" โดยอัตโนมัติ ซึ่งจะช่วยตรวจจับข้อผิดพลาดในการสร้างและชื่อสัญลักษณ์ที่ไม่ถูกต้องได้เร็วขึ้น พฤติกรรมเดิมสามารถย้อนกลับได้หากจำเป็น โดยใช้ RUSTFLAGS=-Clink-arg=--allow-undefined หรือโดยการระบุโมดูล wasm ที่นำเข้าอย่างชัดเจนโดยใช้ #[link(wasm_import_module = "env")]สินค้าได้รับการอัปเดตแก้ไขช่องโหว่ด้านความปลอดภัยแล้ว
การเปลี่ยนแปลงทางภาษา
การเผยแพร่ครั้งนี้ประกอบด้วย: มีการแก้ไขและปรับปรุงเล็กน้อยหลายประการ: อนุญาตให้ส่งผ่านเมตาแวริเบิล expr ของมาโครไปยัง cfg แก้ไขปัญหาการแปลงประเภทที่ไม่เคยเกิดขึ้นในนิพจน์ทูเพิล แก้ไขกรณีหายากของคำแนะนำการอนุมานประเภทที่ไม่ถูกต้องสำหรับอาร์กิวเมนต์ฟังก์ชัน เพิ่มการสนับสนุนสำหรับรีจิสเตอร์เวกเตอร์ s390x ในแอสเซมบลีแบบอินไลน์ และอนุญาตให้ใช้ค่าคงที่ ManuallyDrop เป็นเทมเพลตอีกครั้ง ซึ่งเป็นการแก้ไขข้อผิดพลาดที่เกิดขึ้นใน Rust 1.94.0การเปลี่ยนแปลงในคอมไพเลอร์และแพลตฟอร์ม
สำหรับ Linuxได้เปิดใช้งานการรองรับการผ่อนคลายลิงก์สำหรับเป้าหมาย LoongArch แล้ว ซึ่งเป็นการเพิ่มประสิทธิภาพการเชื่อมโยงที่ช่วยลดความซับซ้อนของการเปลี่ยนผ่านและการเรียกใช้บางอย่างหลังจากการปรับใช้โค้ด สำหรับ riscv64gc-unknown-fuchsia การกำหนดค่าพื้นฐานได้รับการอัปเดตเป็นโปรไฟล์ RVA22 พร้อมการสนับสนุนส่วนขยายเวกเตอร์การอัปเดตไลบรารีมาตรฐาน
ได้เพิ่มการรองรับการวนซ้ำในช่วงจำนวนเต็มที่ไม่เป็นศูนย์แล้ว นอกจากนี้ยังได้แก้ไขการจัดการที่อยู่โฮสต์แบบเลซี่ใน SGX ผ่าน ToSocketAddr และได้ชี้แจงความหมายของหน่วยความจำที่ "อ่านได้/เขียนได้" ในเอกสารและข้อตกลงภายในให้ชัดเจนยิ่งขึ้น โดยได้ลบตัวชี้ว่างออกจากคำจำกัดความทั่วไป และขณะนี้ได้ระบุข้อยกเว้นแยกต่างหากสำหรับวิธีการเฉพาะแล้วAPI ที่มีเสถียรภาพ
อินเทอร์เฟซที่เสถียรแล้ว ได้แก่ assert_matches!, debug_assert_matches! และการใช้งานของ From สำหรับ AssertUnwindSafe เลซี่เซลล์ และ LazyLock รวมถึงประเภทช่วงและตัววนซ้ำใหม่จาก core::range ซึ่งรวมถึง Range, RangeFrom, RangeToInclusive และตัววนซ้ำของพวกมันด้วยCargo: มีการเปลี่ยนแปลงเกี่ยวกับส่วนประกอบที่จำเป็นและเอกสารประกอบ
ขณะนี้การพึ่งพา (dependency) สามารถระบุได้ทั้งที่เก็บ Git และรีจิสทรีทางเลือก: เวอร์ชัน Git จะถูกใช้ในเครื่อง และเวอร์ชันรีจิสทรีจะถูกใช้ในระหว่างการเผยแพร่ คล้ายกับพฤติกรรมของ crates.io นอกจากนี้ยังเพิ่มการสนับสนุนสำหรับ target.'cfg(..)'.rustdocflags ในการกำหนดค่า Cargo ด้วยRustdoc เวอร์ชันใหม่นี้จัดการเอกสารได้แม่นยำยิ่งขึ้น
หมายเหตุ API ที่เลิกใช้แล้วจะถูกแสดงผลเป็นเอกสารปกติ โดยไม่ต้องมีการประมวลผลพิเศษผ่าน white-space: pre-wrap เหมือนแต่ก่อน นอกจากนี้ rustdoc จะไม่ตรวจสอบ lint สำหรับ missing_doc_code_examples ขององค์ประกอบภายใน impl อีกต่อไป และเมธอดและฟังก์ชันที่เกี่ยวข้องจะถูกแยกออกจากกันในแถบด้านข้างของเอกสารอาจเกิดความไม่เข้ากัน
การอัปเดตครั้งนี้มีการเปลี่ยนแปลงหลายอย่างที่อาจปรากฏในโค้ดที่ไม่เป็นไปตามมาตรฐาน: รูปแบบของ enum #[repr(Int)] บางตัวได้รับการแก้ไขในกรณีสุดขั้ว และการแปลงประเภทที่ไม่จำเป็นบางอย่างใน Pin ได้ถูกปิดใช้งานแล้ว การสร้าง WebAssembly ตอนนี้จะเกิดข้อผิดพลาดเมื่อพบสัญลักษณ์ที่ไม่ถูกกำหนดไว้ คุณสมบัติ #![reexport_test_harness_main] ที่ถูกทำให้เสถียรโดยไม่ได้ตั้งใจได้ถูกจำกัดการใช้งานอีกครั้ง ตัวเลือก -Csoft-float ถูกลบออก และเวอร์ชัน LLVM ภายนอกขั้นต่ำได้ถูกเพิ่มขึ้นเป็น 21 สำหรับ AVR ประเภท c_double ได้ถูกเปลี่ยนเป็น f32 เนื่องจาก C double เป็น 32 บิตโดยค่าเริ่มต้นบนเป้าหมายเหล่านี้
ที่มา: linux.org.ru
