Değişmez bir değişkene değiştirilebilir bir referans mı elde edersiniz?

Aug 19 2020

İşte kod, adeğişmez olarak ilan edildiğinden, değişken bir referans alamıyoruz a, değil mi? Ama bu derlendi, bu neden?

struct Foo;

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

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

kod bağlantısı

Yanıtlar

5 SvenMarnach Aug 19 2020 at 14:07

Değişkenin atürü &mut Foo, yani akendisi bir Foonesneye değiştirilebilir bir referanstır . Mutasyon a, onu farklı bir Foonesneye işaret etmek anlamına gelir . Yana akendisi değişmez, ne değiştiremezsiniz aişaret ediyor, ve kod herhangi bir şekilde bu haksız çıkarmaz.

Kodunuz basitçe parametresi &mut Fooolarak geçer - türünün de olduğunu unutmayın . Otomatik yeniden referanslama gerçekleşmiyor - zaten tam olarak parametre için beklenen türe sahip . Bununla birlikte, burada örtük bir yeniden borçlanma başlatıyoruz , bu nedenle çağrı ile eşdeğerdir . Bu örtük yeniden ödünç alma, kodun çalışmasını sağlayan şey değildir - değişken referansın dışarı çıkarılmasına da tamamen izin verilecektir.selfmut_ref()self&mut FooaselfFoo::mut_ref(&mut *a)a

aDeğişken olarak değişmez olsa da, yine de değiştirilebilir bir referanstır, böylece Fooişaret ettiği nesneyi değiştirebilirsin ( Foomutasyona uğrayacak herhangi bir durum olduğunu varsayarak ). Türüne asahip olması gereken değişken bir referans elde edemezsiniz &mut &mut Foo.