2017-04-20 56 views
5

Ben Rust 1.13 yüklü ve denenmiş:Dönüştürücü, değiştirilemez olarak bildirilmeyen bir değişken değiştirildiğinde neden bir hata bildirmiyor?

fn main() { 
    let x: u32; 
    x = 10; // no error? 
} 
Bazı uyarılar var bu dosyayı derlenmiş

, ancak hiçbir hata vardır. x'un mut olarak bildirilmediğinden hata yapmamalı mı? Yazdığınız ne

+10

Bu mutasyon değil erteleme başlatılıyor. – ildjarn

+2

Rust 1.16, Rust'un güncel sürümüdür ve 1.17 birkaç hafta içinde piyasaya sürülmelidir. Güncel kalmak için buna değer. – Shepmaster

cevap

12

aynıdır:

let x: u32 = 10; 

derleyici bundan sonra onu mutasyona için izin vermez: Bir kullanmaya çalışırsanız bir derleyici hatadır

let x: u32; 
x = 10; 
x = 0; // Error: re-assignment of immutable variable `x` 

Not olduğunu Başlatılmamış değişken:

let x: u32; 
println!("{}", x); // Error: use of possibly uninitialized variable: `x` 

Ini istiyorsanız, bu özellik oldukça yararlı olabilir Çalışma koşullarına bağlı olarak değişkeni farklı şekilde tialize edin. Saf bir örnek:

let x: u32; 
if condition { 
    x = 1; 
} else if other_condition { 
    x = 10; 
} else { 
    x = 100; 
} 

Ama başlatılmamış olduğunu bir olasılık varsa hala hala bir hata olacaktır:

belirtildiği gibi
let x: u32; 
if condition { 
    x = 1; 
} else if other_condition { 
    x = 10; 
} // no else 
println!("{:?}", x); // Error: use of possibly uninitialized variable: `x` 
+4

Idiyomatik pas burada daha büyük bir ifadeye dayalı sözdizimini kullanır: 'diyelim x = eğer koşul {1} ​​başka eğer diğer_koşullar {10} else {100};'. Bu örneklerde ertelenmiş başlatmaya gerek yoktur. –

+1

@MatthieuM. Bu doğru. Ancak şartlı dalların bazılarında farklı yan etkiler olsaydı, garip görünebilirdi. Bu durumda, bu formun daha aptalca olacağını düşünüyorum. –

8

, bu mutasyon değil, ertelenmiş başlatma:

  • mutasyonu olan bir değişkeni değerinin değiştirilmesi ile ilgili olup,
  • ertelenmiş başlatılmaktadır alizasyon, bir noktada bir değişkenin bildirilmesi ve daha sonra başlatılmasıyla ilgilidir. yanlışlıkla (++ taşındı bir değişken ya da C) farklı bir başlatılmamış değişken kullanarak riski yoktur C aksine çok değişken, derleme zamanında bir değer olup olmadığını

Pas derleyici izler.


ertelenmiş başlatma kullanarak en önemli sebebi kapsamı olduğunu.

fn main() { 
    let x; 
    let mut v = vec!(); 

    { 
     x = 2; 
     v.push(&x); 
    } 

    println!("{:?}", v); 
} 

Rust ariyet denetleyicisi referans bu sarkan referanslar önlenmesi anlamına gelir değeri daha uzun ömürlü olamaz doğrular.

Bu v.push(&x)x uzun v daha yaşar gerektirir ve bu nedenlev önce ilan edilmesi anlamına gelir.

Bunun için gereksinim sık sık yok olmaz, ancak diğer çözümler olduğunda çalışma zamanı kontrolleri gerektirir.