2017-03-24 19 views
8

Aşağıdaki Pas programına sahibim ve x daha sonra yeniden atanmasından beri bir derleme hatasıyla sonuçlanmasını bekliyorum. Ama buna uyuyor ve çıktı veriyor. Niye ya?Neden bu Pas programı değişmezliği görmezden geliyor

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

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

cevap

13

Pas aslında bu kadar let x: i32 = 565;let (x,y) = (1,3); ile daha önce tanımlanmış x gölgeler bir yeni değişken x tanımlıyor, bir blokta diğer değişkenleri gölge sağlar. İkinci x tamamen yeni bir değişken olduğundan, farklı bir türe sahip olmak için x yeniden tanımladığınızı unutmayın!

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

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

Bu reddit thread bu yararlı olmasının nedeni hakkında daha ayrıntılı anlatır. ilginç görünüyor bahsedilmektedir iki şey vardır: değişkenin sahipliğini almak, ama aynı türdeki başka bir değişken dönüş işlemleri için

  • , bazen sahip döndü değişkeni yeniden tanımlamak için "hoş görünüyor" aynı isim. here Gönderen:

    let iter = vec.into_iter(); 
    let iter = modify(iter); 
    let iter = double(iter); 
    
  • Veya değişken değişmez yapmak için:

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

bu dilde izin verilir Neden? Bu, mantık hatalarının büyük programda kolayca görülmesine neden olmaz mı? Gölgeleme amacı nedir ve bu kavramı kullanan başka bir dil var mı? – Viraj

+0

Önceden gölgelenen bir değişkeni nasıl referanslarsınız? – Dai

+3

@Dai Yapabileceğinizi sanmıyorum ... Sahipliği her zaman başka bir değişkene geçirebilirsiniz 'let y = x'. – Alec