2016-03-16 36 views
11

Rust by Example'daki örneklerle çalışıyorum. hareket değerTaşınan bir değerin bir üyesi atandığında derleme neden başarısız olmaz?

kullanımı:

fn main() { 
    let mut point: Point = Point { x: 0.3, y: 0.4 }; 
    println!("point coordinates: ({}, {})", point.x, point.y); 

    let rectangle = Rectangle { 
     p1: Point { x: 1.0, y: 1.0 }, 
     p2: point, 
    }; 

    point.x = 0.5;  // Why does the compiler not break here? 
    println!(" x is {}", point.x); // breaks here 

    println!("rectangle is {:?} ", rectangle); 
} 

bu hata (Rust 1.7) elde point.x
println ("x {}", point.x);!

Şimdi ben Rectangle nesneye point verdiğini anlamak ve artık erişebilirsiniz yüzden ancak neden derleme println! değil önceki satırda üzerinde atama üzerinde başarısız oluyor? Gerçekten ne olur

+2

tartışılmaktadır [Daha küçük bir yeniden üretim] (http://is.gd/j8aovB). – Shepmaster

+1

Sanırım "taşınan bir değer kullanmak", değerini denediğiniz ve okuduğunuz nokta olarak yorumlanabilir. Ona atama, Rust'un garantilerini gerçekten “teknik” bir anlamda değiştirmez, sadece taşınan bir değeri denediğinizde ve tüketirken. Bununla birlikte, bunların çoğunu yeterince iyi anlamadım, bu yüzden daha fazla olan insanlardan haber almakla ilgileniyorum. –

+0

Compiller bugüne benziyor. Daha ilginç olan şey, 'p2 = point; point.x = 0.5; println! ("X is {}", p2.x); 'ince ve baskılar 0.3 derler, bu yüzden point.x = 0.5;' nothng – qthree

cevap

6

fn main() { 
    let mut point: Point = Point { x: 0.3, y: 0.4 }; 
    println!("point coordinates: ({}, {})", point.x, point.y); 

    drop(point); 

    { 
     let mut point: Point; 
     point.x = 0.5; 
    } 

    println!(" x is {}", point.x); 
} 

O sorunla iyi bilinen çıkıyor.

https://github.com/rust-lang/rust/issues/21232

+0

Yuvalanmış blokta neden başka bir “izinli nokta” var? Sorunu değiştirmezsiniz çünkü atadığınız nokta yeni bir nokta, düşmüş olan bellekten farklı bir yerde mi? –

+1

@AlexKnauth Sanırım fikir, derleyicinin gördüğü gibi neler olduğuna işaret etmektir. Yani, derleyici oradaki ek kapsamı, atamaya izin veren kendi "noktası" ile görür. –

+0

Çünkü 'point.x = 0.5; 'orijinal kodunda taşınan değerle hiçbir şey yapmaz, ancak yeni değeri başlatmaya çalışır. – qthree

3

sorun derleyici bir yapı kısmi yeniden başlatma izin vermektedir, ancak bütün yapı bundan sonra kullanılamaz. Bu, yapının yalnızca bir alan içermesi ve hatta yalnızca yeniden başlattığınız alanı okumayı deneseniz bile gerçekleşir.

struct Test { f: u32, } 

fn main() { 
    let mut t = Test { f: 0, }; 
    let t1 = t; 
    t.f = 1; 
    println!("{}", t.f); 
} 

Bu https://github.com/rust-lang/rust/issues/21232

+0

Bu cevabın [varolan cevap] ötesine ne sunduğuna emin değilim (http://stackoverflow.com/a/36051503/155423) – Shepmaster

+1

@Shepmaster Yanlış olan parçayı kaldırır. Bir bonus olarak, sadece bir linkin kötü bir biçim olduğu için konunun kısa bir açıklamasını ekledim. – starblue

İlgili konular