2017-03-24 18 views
8

Tôi có chương trình Rust sau đây và tôi hy vọng nó sẽ dẫn đến lỗi biên dịch kể từ khi x được gán lại sau. Nhưng nó tuân thủ và cho đầu ra. Tại sao?Tại sao chương trình Rust này bỏ qua bất biến

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

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

Trả lời

13

Rust thực sự cho phép bạn shadow biến khác trong một khối, vì vậy let x: i32 = 565; được xác định một mới biến x rằng bóng tối các x được xác định trước đó với let (x,y) = (1,3);. Lưu ý rằng bạn thậm chí có thể đã xác định lại x để có một loại khác kể từ lần thứ hai x là một biến hoàn toàn mới!

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

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

reddit thread xem chi tiết hơn tại sao điều này hữu ích. Hai điều được đề cập mà dường như thú vị là:

  • Đối với hoạt động đó mất quyền sở hữu của biến, nhưng trở lại một biến khác cùng loại, đôi khi nó "có vẻ tốt đẹp" để xác định lại biến trở về có cùng tên. Từ here:

    let iter = vec.into_iter(); 
    let iter = modify(iter); 
    let iter = double(iter); 
    
  • Hoặc để làm cho một biến bất biến:

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

Tại sao điều này được cho phép trong ngôn ngữ? Điều này không gây ra lỗi logic không dễ dàng để tìm trong chương trình lớn? Mục đích của bóng tối là gì và có bất kỳ ngôn ngữ nào khác sử dụng khái niệm này không? – Viraj

+0

Làm cách nào để bạn có thể tham chiếu biến trước đây? – Dai

+3

@Dai Tôi không nghĩ rằng bạn có thể ... Bạn luôn có thể chuyển quyền sở hữu cho biến khác 'let y = x'. – Alec

Các vấn đề liên quan