ได้รับการอ้างอิงที่เปลี่ยนแปลงได้กับตัวแปรที่ไม่เปลี่ยนรูปหรือไม่?

Aug 19 2020

นี่คือรหัสเนื่องจากaถูกประกาศว่าไม่เปลี่ยนรูปเราจึงไม่สามารถรับข้อมูลอ้างอิงที่เปลี่ยนแปลงได้aใช่ไหม? แต่อันนี้เรียบเรียงทำไมถึงเป็นอย่างนั้น?

struct Foo;

fn main() {
    let a = &mut Foo;
    a.mut_ref();
}

impl Foo {
    fn mut_ref(&mut self) { }
}

รหัสลิงค์

คำตอบ

5 SvenMarnach Aug 19 2020 at 14:07

ประเภทของตัวแปรaเป็น&mut Fooเช่นaนั้นเองคือการอ้างอิงที่ไม่แน่นอนกับFooวัตถุ การกลายพันธุ์aจะหมายถึงการทำให้มันชี้ไปที่Fooวัตถุอื่น เนื่องจากaตัวมันเองไม่เปลี่ยนรูปคุณจึงไม่สามารถเปลี่ยนแปลงสิ่งที่aชี้ไปได้และรหัสของคุณจะไม่หักล้างสิ่งนี้ แต่อย่างใด

รหัสของคุณเพียงแค่ผ่าน&mut Fooเป็นselfพารามิเตอร์mut_ref()- ทราบว่าประเภทของนอกจากนี้ยังมีself &mut Fooไม่มีการอ้างอิงอัตโนมัติเกิดขึ้น - aมีประเภทที่กำหนดไว้สำหรับselfพารามิเตอร์อยู่แล้ว อย่างไรก็ตามเรายังวิกฤติ reborrow นัยFoo::mut_ref(&mut *a)ที่นี่จึงโทรเทียบเท่ากับ การ reborrow โดยปริยายนี้ไม่ใช่สิ่งที่ทำให้โค้ดใช้งานได้ - การย้ายการอ้างอิงที่ไม่แน่นอนออกไปaจะได้รับอนุญาต

แม้ว่าaจะไม่เปลี่ยนรูปเป็นตัวแปร แต่ก็ยังคงเป็นข้อมูลอ้างอิงที่ไม่แน่นอนดังนั้นคุณสามารถกลายพันธุ์Fooวัตถุที่ชี้ไปได้ (สมมติว่าFooมีสถานะใด ๆ ที่จะกลายพันธุ์) คุณไม่สามารถได้รับการอ้างอิงที่ไม่แน่นอนในการที่จะต้องมีชนิดa&mut &mut Foo