2017-03-24 18 views
8

我有下面的Rust程序,我期望它会导致编译错误,因为x将在稍后重新分配。但它符合并提供输出。为什么?为什么这个Rust程序忽略不变性

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

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

回答

13

锈却让你的影子其他变量在一个块,所以let x: i32 = 565;被定义变量x是阴影与let (x,y) = (1,3);前面定义的x。请注意,因为第二个x是一个全新的变量,所以你甚至可以重新定义x具有不同的类型!

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

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

reddit thread更详细地介绍了为什么这很有用。所提到的两件事情,似乎有趣的是:

  • 对于那些采取变量的所有权,但返还相同种类的另一个变量的操作,有时“看起来不错”重新定义返回的变量有一样的名字。从here

    let iter = vec.into_iter(); 
    let iter = modify(iter); 
    let iter = double(iter); 
    
  • 或进行变量不变:

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

为什么这是允许的语言?这不会导致逻辑错误不容易在大型程序中出现吗?阴影的目的是什么?有没有其他语言使用这些概念? – Viraj

+0

如何引用一个以前被遮蔽的变量? – Dai

+3

@Dai我不认为你可以......你总是可以将所有权交给另一个变量'let y = x'。 – Alec