2017-03-24 13 views
8

Mam następujący program Rust i oczekuję, że spowoduje to błąd kompilacji, ponieważ x zostanie ponownie przypisany. Ale spełnia i daje wydajność. Czemu?Dlaczego ten program Rust ignoruje niezmienność

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

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

Odpowiedz

13

Rust faktycznie pozwala cień inne zmienne w bloku, więc let x: i32 = 565; jest zdefiniowanie nowy zmienną x że cienie z x zdefiniowanego wcześniej z let (x,y) = (1,3);. Zauważ, że możesz nawet przedefiniować x, aby mieć inny typ, ponieważ druga x to zupełnie nowa zmienna!

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

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

Ten numer reddit thread zawiera bardziej szczegółowe informacje na temat tego, dlaczego jest to przydatne. Dwie rzeczy, które są wymienione, które wydają się interesujące są:

  • W przypadku operacji, które biorą własność zmiennej, ale wracają innej zmiennej tego samego typu, to czasami „ładnie wygląda” przedefiniować zmienną zwrócony mieć Takie samo imię. Od here:

    let iter = vec.into_iter(); 
    let iter = modify(iter); 
    let iter = double(iter); 
    
  • lub złożyć zmienna niezmienne:

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

Dlaczego jest to dozwolone w języku? Czy to nie powoduje błędów logicznych w dużym programie? Jaki jest cel shadowingu i czy istnieje jakikolwiek inny język, który korzysta z tej koncepcji? – Viraj

+0

Jak można odwoływać się do poprzednio zacienionej zmiennej? – Dai

+3

@Dai Nie sądzę, że możesz ... Zawsze możesz przekazać własność innej zmiennej 'let y = x'. – Alec