2017-03-24 4 views
8

Ich habe das folgende Rust-Programm und ich erwarte, dass es zu einem Kompilierungsfehler führt, da x später neu zugewiesen wird. Aber es entspricht und gibt eine Ausgabe. Warum?Warum dieses Rust-Programm Unveränderlichkeit ignorieren

fn main() { 
    let (x, y) = (1, 3); 
    println!("X is {} and Y is {}", x, y); 

    let x: i32 = 565; 
    println!("Now X is {}", x); 
} 

Antwort

13

Rust tatsächlich können Sie andere Variablen in einem Block Schatten, so ist let x: i32 = 565; eine neue Variable x definieren, die die x definiert früher mit let (x,y) = (1,3); Schatten. Beachten Sie, dass Sie sogar x neu definiert haben könnten, um einen anderen Typ zu haben, da die zweite x eine ganz neue Variable ist!

fn main(){ 
    let x = 1; 
    println!("Now X is {}",x); 

    let x = "hi"; 
    println!("Now X is {}",x); 
} 

Diese reddit thread geht mehr ins Detail darüber, warum dies sinnvoll ist. Die beiden Dinge, die erwähnt werden, die interessant scheinen, sind:

  • Für Operationen, die das Eigentum an der Variablen nehmen, aber eine andere Variable des gleichen Typs zurückgeben, ist es manchmal „schön aussieht“, um die zurückgegebenen Variablen neu zu definieren, die haben gleicher Name. Von here:

    let iter = vec.into_iter(); 
    let iter = modify(iter); 
    let iter = double(iter); 
    
  • oder eine Variable unveränderlich zu machen:

    let mut x; 
    // Code where `x` is mutable 
    let x = x; 
    // Code where `x` is immutable 
    
+1

Warum in der Sprache erlaubt ist das? Führt dies nicht zu logischen Fehlern, die in einem großen Programm nicht leicht zu erkennen sind? Was ist der Zweck des Shadowings und gibt es eine andere Sprache, die dieses Konzept verwendet? – Viraj

+0

Wie können Sie auf eine zuvor beschattete Variable verweisen? – Dai

+3

@Dai Ich glaube nicht, dass du ... Du könntest Besitzrechte immer an eine andere Variable übergeben, lass y = x. – Alec