การจัดการหน่วยความจำอัตโนมัติของ Rust ช่วยให้นักพัฒนาเป็นอิสระจากการจัดการพอยน์เตอร์ และป้องกันปัญหาที่เกิดจากการจัดการหน่วยความจำระดับต่ำ เช่น การเข้าถึงหน่วยความจำหลังจากว่าง การยกเลิกการอ้างอิงพอยน์เตอร์ null บัฟเฟอร์โอเวอร์รัน และอื่นๆ ที่คล้ายกัน ตัวจัดการแพ็คเกจกำลังได้รับการพัฒนาเพื่อแจกจ่ายไลบรารี ตรวจสอบการประกอบและจัดการการพึ่งพาโดยโปรเจ็กต์
หลัก
- ตัวจัดการแพ็คเกจ Cargo ได้เพิ่มเครื่องมือเพื่อทำงานกับการลงทะเบียนแพ็คเกจทางเลือกที่สามารถอยู่ร่วมกับการลงทะเบียนสาธารณะ crates.io ตัวอย่างเช่น นักพัฒนาแอปพลิเคชันที่เป็นกรรมสิทธิ์สามารถใช้รีจิสตรีส่วนตัวของตนเองได้ ซึ่งสามารถใช้เพื่อแสดงรายการการขึ้นต่อกันใน Cargo.toml และใช้โมเดลการกำหนดเวอร์ชันที่คล้ายกับ crates.io สำหรับผลิตภัณฑ์ของตน ตลอดจนอ้างอิงการขึ้นต่อกันของทั้งสองลัง io และไปยังรีจิสทรีของคุณเอง
หากต้องการเพิ่มการลงทะเบียนภายนอกให้กับ .cargo/config (อยู่ใน $HOME หรือในไดเร็กทอรีแพ็คเกจ)
ที่ให้ไว้ ส่วน “[รีจิสทรี]” และหากต้องการใช้รีจิสทรีภายนอก ตัวเลือก “รีจิสทรี” จะปรากฏในคำอธิบายของการขึ้นต่อกันแต่ละรายการใน Cargo.toml หากต้องการเชื่อมต่อกับรีจิสทรีเพิ่มเติม เพียงวางโทเค็นการรับรองความถูกต้องในไฟล์ ~/.cargo/credentials แล้วรันคำสั่ง
"cargo login --registry=my-registry" และเพื่อเผยแพร่แพ็คเกจ -
"เผยแพร่สินค้า -registry=my-registry"; - เพิ่มการสนับสนุนอย่างเต็มที่สำหรับการใช้ตัวดำเนินการ “?” ในการทดสอบ
คำสอน ทำให้คุณสามารถใช้โค้ดตัวอย่างจากเอกสารประกอบเป็นการทดสอบได้ ผู้ดำเนินการก่อนหน้านี้
"?" สามารถใช้เพื่อจัดการกับข้อผิดพลาดระหว่างการทดสอบเมื่อมีฟังก์ชัน “fn main()” หรือในฟังก์ชัน “#[test]” เท่านั้น - ในแอตทริบิวต์แบบกำหนดเองที่กำหนดโดยใช้มาโครขั้นตอน
ที่ให้ไว้ ความสามารถในการใช้ชุดโทเค็นที่กำหนดเอง (“#[attr($tokens)]”, “#[attr[$tokens]] และ #[attr{$tokens}]”) ก่อนหน้านี้ องค์ประกอบสามารถระบุได้เฉพาะในรูปแบบต้นไม้/แบบเรียกซ้ำโดยใช้ตัวอักษรสตริง เช่น “#[foo(bar, baz(quux, foo = “bar”))]” แต่ตอนนี้ เป็นไปได้ที่จะใช้การแจงนับ (' #[range(0. .10)]') และโครงสร้างเช่น “#[bound(T: MyTrait)]”; - ประเภทเสถียร (ลักษณะ)
ลองจาก иลองอิน อนุญาตให้แปลงประเภทพร้อมการจัดการข้อผิดพลาด ตัวอย่างเช่น วิธีการอย่าง from_be_bytes ที่มีประเภทจำนวนเต็มจะใช้อาร์เรย์เป็นอินพุต แต่ข้อมูลมักจะอยู่ในประเภท Slice และการแปลงระหว่างอาร์เรย์และสไลซ์นั้นเป็นปัญหาหากดำเนินการด้วยตนเอง ด้วยความช่วยเหลือของลักษณะใหม่ การดำเนินการที่ระบุสามารถดำเนินการได้ทันทีผ่านการเรียกไปที่ .try_into() ตัวอย่างเช่น “let num = u32::from_be_bytes(slice.try_into()?)” สำหรับ Conversion ที่ประสบความสำเร็จเสมอ (เช่น จากประเภท u8 เป็น u32) มีการเพิ่มประเภทข้อผิดพลาดไม่ผิดพลาด ทำให้สามารถใช้งานได้อย่างโปร่งใส
TryFrom สำหรับการใช้งาน "From" ที่มีอยู่ทั้งหมด - ฟังก์ชันเลิกใช้งานแล้ว
CommandExt::before_exec ซึ่งอนุญาตให้ตัวจัดการถูกดำเนินการก่อนที่จะรัน exec ซึ่งถูกดำเนินการในบริบทของกระบวนการลูกที่ถูกแยกหลังจากการเรียก fork() ภายใต้เงื่อนไขดังกล่าว ทรัพยากรบางอย่างของกระบวนการหลัก เช่น ตัวอธิบายไฟล์และพื้นที่หน่วยความจำที่แมป อาจทำซ้ำได้ ซึ่งอาจนำไปสู่พฤติกรรมที่ไม่ได้กำหนดไว้และการทำงานของไลบรารีไม่ถูกต้อง
ขอแนะนำให้ใช้ฟังก์ชันที่ไม่ปลอดภัยแทน before_execCommandExt::pre_exec . - ประเภทจำนวนเต็มอะตอมมิกที่ลงนามและไม่ได้ลงนามที่มีความเสถียร ซึ่งมีขนาดตั้งแต่ 8 ถึง 64 บิต (เช่น
อะตอมมิกU8 ) เช่นเดียวกับประเภทที่ลงนามไม่เป็นศูนย์I [8|16|32|64|128]. - ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ที่เสถียร รวมถึง Any::type_id, Error::type_id, Slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub ] และเมธอด SystemTime ได้รับความเสถียร ::checked_[add|sub] ฟังก์ชัน iter::from_fn และ iter::successors มีความเสถียร;
- สำหรับประเภทจำนวนเต็มทั้งหมด จะใช้เมธอดcheck_pow, saturating_pow, wrap_pow และ overflowing_pow
- เพิ่มความสามารถในการเปิดใช้งานการปรับให้เหมาะสมในขั้นตอนการเชื่อมโยงโดยการระบุตัวเลือกการสร้าง “-C linker-plugin-lto”
ที่มา: opennet.ru