Dapatkan referensi yang bisa diubah ke variabel yang tidak bisa diubah?

Aug 19 2020

Ini kodenya, karena adideklarasikan sebagai tidak dapat diubah, kita tidak dapat memperoleh referensi yang dapat diubah a, bukan? Tapi yang ini sudah terkompilasi, kenapa bisa begitu?

struct Foo;

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

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

kode-tautan

Jawaban

5 SvenMarnach Aug 19 2020 at 14:07

Jenis variabel aadalah &mut Foo, yaitu aitu sendiri adalah referensi bisa berubah ke Fooobjek. Mutasi aberarti membuatnya menunjuk ke Fooobjek yang berbeda . Karena aitu sendiri tidak dapat diubah, Anda tidak dapat mengubah apa ayang menunjuk, dan kode Anda tidak menyangkal hal ini dengan cara apa pun.

Kode Anda hanya meneruskan &mut Foosebagai selfparameter ke mut_ref()- perhatikan bahwa jenisnya selfjuga &mut Foo. Tidak ada dereferensi otomatis yang terjadi - asudah memiliki tipe yang sama persis dengan yang diharapkan untuk selfparameter. Namun, kami memicu peminjaman kembali implisit di sini, jadi panggilan tersebut setara dengan Foo::mut_ref(&mut *a). Namun, peminjaman ulang implisit ini bukanlah yang membuat kode berfungsi - memindahkan referensi yang bisa berubah ajuga akan diizinkan dengan sempurna.

Meskipun atidak dapat diubah sebagai variabel, ini masih merupakan referensi yang dapat diubah, sehingga Anda dapat mengubah Fooobjek yang dituju (dengan asumsi Foostatus apa pun untuk dimutasi). Anda tidak bisa mendapatkan referensi yang bisa berubah ke a, yang harus memiliki tipe &mut &mut Foo.