2016-04-02 14 views
0

aşağıdaki kodu derlerken Bu hataları alıyorum için geçerli olmalıdır ... sadece (kod 1)Hata: ödünç değer referans

error: v does not live long enough vec.push(&v);

note: reference must be valid for the block suffix following statement 0 at 15:64...

note: ...but borrowed value is only valid for the block suffix following statement 2 at 19:35

(kod 1)

fn main() { 

    let mut vec: Vec<&Inf> = Vec::<&Inf>::new();//<-- It appears the error 

    let p: Foo1 = Foo1::created(); 
    let v: Foo2 = Foo2::created(); 

    vec.push(&v); 
    vec.push(&p); 

olduğunu ancak vec, p ve v öğelerini taşıdığımda değil.

(kod 2)

fn main() { 

    let p: Foo1 = Foo1::created(); 
    let v: Foo2 = Foo2::created(); 

    //It does not appear the error described above 
    let mut vec: Vec<&Inf> = Vec::<&Inf>::new(); //<-- It does not appear the error 
    vec.push(&v); 
    vec.push(&p); 

..// 

(beni açıklayabilirim birisi ise, bu davranış, normal olabilir.)

Bu yüzden hatayı görebilirsiniz oluşturulan benzer bir durumdur


Hata play.rust

Bu ownership hakkında okumak Hata yok play.rust


ve bu borrowing

cevap

5

Evet, bu davranış kesinlikle normal ve doğaldır.

İşte basit bir örnek:

{ 
    let x = 1; 
    let mut v = Vec::new(); 

    v.push(&x); 
} 

Bu kod derler, ama bu değil:

{ 
    let mut v = Vec::new(); 
    let x = 1; 

    v.push(&x); 
} 

değişkenler imha emri onların inşaat düzenin tersidir çünkü bu olur. zaman

olduğunu
v created 
x created 
v[0] = &x 
x destroyed // x is destroyed, but v still holds a reference to x! 
v destroyed 

, alt örnekte (görünmez yakın olsa) bir an vardır:

x created 
v created 
v[0] = &x 
v destroyed 
x destroyed 

Ama alt birinde bu elimizde: Üst örnekte böyle gider Zaten imha edilen x için olağanüstü bir referans var.

İlgili konular