การจัดการหน่วยความจำอัตโนมัติของ Rust ช่วยให้นักพัฒนาเป็นอิสระจากการจัดการพอยน์เตอร์ และป้องกันปัญหาที่เกิดจากการจัดการหน่วยความจำระดับต่ำ เช่น การเข้าถึงหน่วยความจำหลังจากว่าง การยกเลิกการอ้างอิงพอยน์เตอร์ null บัฟเฟอร์โอเวอร์รัน และอื่นๆ ที่คล้ายกัน ตัวจัดการแพ็คเกจกำลังได้รับการพัฒนาเพื่อแจกจ่ายไลบรารี ตรวจสอบการประกอบและจัดการการพึ่งพาโดยโปรเจ็กต์
หลัก
- เพิ่มความสามารถในการทำเครื่องหมายโครงสร้าง (struct) และการแจงนับ (แจงนับด้วยบล็อก Variant) โดยใช้แอตทริบิวต์ "
#[ไม่_ละเอียดถี่ถ้วน ]", ที่ช่วยให้ ในอนาคต ให้เพิ่มฟิลด์และตัวเลือกใหม่ให้กับโครงสร้างและการแจงนับที่ประกาศ ตัวอย่างเช่น นักพัฒนาโมดูลที่มีโครงสร้างพร้อมฟิลด์ที่ประกาศต่อสาธารณะสามารถใช้ "#[non_exhaustive]" เพื่อทำเครื่องหมายโครงสร้างที่อาจมีฟิลด์ใหม่ที่เพิ่มเข้ามาในอนาคต จนถึงขณะนี้ ในสถานการณ์นี้ นักพัฒนาถูกบังคับให้เลือกระหว่างการประกาศฟิลด์แบบส่วนตัวและการผูกเข้ากับรายการฟิลด์ที่ไม่เปลี่ยนรูป แอตทริบิวต์ใหม่จะลบข้อจำกัดนี้ออก และอนุญาตให้คุณเพิ่มฟิลด์ใหม่ได้ในอนาคตโดยไม่มีความเสี่ยงที่จะทำลายโค้ดภายนอกที่คอมไพล์ไว้ก่อนหน้านี้ ในแพ็คเกจลัง เมื่อตัวเลือกการจับคู่ในส่วน "ตรงกัน" จำเป็นต้องมีคำจำกัดความที่ชัดเจนของมาสก์ "_ => {...}" ซึ่งครอบคลุมฟิลด์ที่เป็นไปได้ในอนาคต มิฉะนั้นข้อผิดพลาดจะปรากฏขึ้นเมื่อเพิ่มฟิลด์ใหม่ -
เพิ่ม ความสามารถในการเรียกแมโครขั้นตอน mac!() ในบริบทประเภท ตัวอย่างเช่น ตอนนี้คุณสามารถเขียน “type Foo = expand_to_type!(bar);” หาก “expand_to_type” เป็นมาโครขั้นตอน - ในบล็อก "ภายนอก { ... }"
เพิ่ม ความสามารถในการใช้มาโครขั้นตอนและแอตทริบิวต์ รวมถึงมาโคร “bang!()” ตัวอย่างเช่น:มาโคร_กฎ! make_item { ($ชื่อ: ident) => { fn $name(); } }
ภายนอก {
make_item!(อัลฟ่า);
make_item!(เบต้า);
}ภายนอก "C" {
#[my_identity_มาโคร] fn ฟู();
} - ในมาโคร
นำไปใช้ ความสามารถในการสร้างองค์ประกอบ “macro_rules!” กำลังสร้าง "macro_rules!" เป็นไปได้ทั้งในมาโครที่มีลักษณะคล้ายฟังก์ชัน (“mac!()”) และในมาโครในรูปแบบของแอตทริบิวต์ (“#[mac]”) - ในองค์ประกอบการแมป $m:meta
เพิ่ม รองรับค่าการแจงนับโทเค็นโดยพลการ (“[TOKEN_STREAM]”, “{TOKEN_STREAM}” และ “(TOKEN_STREAM)”) ตัวอย่างเช่น:มาโคร_กฎ! ยอมรับ_meta { ($m:meta) => {} }
Accept_meta!( ของฉัน::เส้นทาง );
Accept_meta!( my::path = "lit" );
Accept_meta!( my::path ( abc ) );
Accept_meta!( my::path [ abc ] );
Accept_meta!( my::path { abc } ); - ในโหมด Rust 2015 เอาต์พุตข้อผิดพลาดจะถูกเปิดใช้งานสำหรับปัญหาที่ระบุเมื่อตรวจสอบการยืมตัวแปร (ตัวตรวจสอบการยืม) โดยใช้เทคนิค NLL (อายุการใช้งานที่ไม่ใช่คำศัพท์) ก่อนหน้านี้ คำเตือนจะถูกแทนที่ด้วยข้อผิดพลาดเมื่อทำงานในโหมด Rust 2018
หลังจากที่การเปลี่ยนแปลงขยายไปสู่โหมด Rust 2015 แล้ว นักพัฒนาก็สามารถทำได้ในที่สุดกำจัด จากตัวตรวจสอบการยืมตัวเก่าให้เราระลึกว่าระบบการตรวจสอบที่ใช้กลไกใหม่ในการพิจารณาอายุการใช้งานของตัวแปรที่ยืมมาทำให้สามารถระบุปัญหาบางอย่างที่รหัสยืนยันเก่าไม่มีใครสังเกตเห็นได้ เนื่องจากเอาต์พุตข้อผิดพลาดสำหรับการตรวจสอบดังกล่าวอาจส่งผลต่อความเข้ากันได้กับโค้ดที่ทำงานก่อนหน้านี้ จึงมีการออกคำเตือนตั้งแต่แรกแทนข้อผิดพลาด
- คุณลักษณะ “const” ซึ่งกำหนดความเป็นไปได้ในการใช้งานในบริบทใดๆ แทนค่าคงที่ ใช้สำหรับฟังก์ชัน is_power_of_two (สำหรับจำนวนเต็มที่ไม่ได้ลงนาม)
- ส่วนใหม่ของ API ถูกย้ายไปยังหมวดหมู่ที่เสถียร รวมถึงมาโคร todo!() และสไลซ์::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value วิธีการได้รับความเสถียร
ตัวเลือก::as_deref, ตัวเลือก::as_deref_mut, ตัวเลือก::แบน, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32, f64}::from_be_bytes, {f32,f64}::from_le_bytes และ {f32,f64}::from_ne_bytes - ในตัวจัดการแพ็คเกจสินค้า
ดำเนินการ คำเตือนคอมไพเลอร์แคชบนดิสก์ เพิ่มตัวเลือก "ข้อมูลเมตาของสินค้า" ให้กับคำสั่ง "ข้อมูลเมตาของสินค้า"--กรองแพลตฟอร์ม " เพื่อแสดงเฉพาะแพ็คเกจที่เชื่อมโยงกับแพลตฟอร์มเป้าหมายที่ระบุในคอลัมน์การแก้ไขการพึ่งพา เพิ่มตัวเลือกการกำหนดค่า http.ssl-version เพื่อกำหนดเวอร์ชัน TLS ที่ถูกต้อง
เพิ่มความสามารถในการเผยแพร่ส่วน "การพึ่งพา dev " โดยไม่ต้องระบุคีย์ "เวอร์ชัน" - คอมไพเลอร์rustc ให้การสนับสนุนระดับที่สามสำหรับแพลตฟอร์มเป้าหมาย thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 และ mips64el-unknown-linux-muslabi64 ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติและการเผยแพร่งานสร้างอย่างเป็นทางการ
ที่มา: opennet.ru