2017-12-11 131 views
7

Ben Pas Kitabın ikinci baskısı okuyorum ve ben yineleyiciler bölümünde aşağıdaki örneği buldu:Derleyici neden yineleyicinin for döngüsüne geçtiğinden şikayet etmiyor?

let v1 = vec![1, 2, 3]; 
let v1_iter = v1.iter();  
for val in v1_iter { 
    println!("Got: {}", val); 
} 

Neden derleyici v1_iter değişmez olduğu şikayet etmiyor? Kitap, for döngüsünün v1_iter sahipliğini aldığını ve sahnelerin arkasında değiştirilebildiğini söylüyor, ancak değişmez bir değişkeni değiştirilebilecek hale getirebilir misiniz?

cevap

9

kitap Kesinlikle, döngü v1_iter sahipliğini aldı ve sahne arkasında o değişken yapılan

diyor ve bir daha basit bir örnek yapabilir:

let v = vec![1,2,3]; 
let mut x = v; 
x.push(0); 

Not o v ve x ayrı değişken bağlamalarıdır: v değişkeni 3 elementli vektörünü koruduğu sürece, değişkenin kontratı vektörün mutasyona uğratılmayacağıydı. Bununla birlikte, vektör, mutabilitenin kabul edilebilir olduğunu beyan eden x'a taşındı. Aynı fonksiyon aramalar için geçerlidir: değişkenler tek ömrü herhangi bir noktasında vektörü sahip çünkü

fn foo(mut x: Vec<i32>) { 
    x.push(0); 
} 

let v = vec![1,2,3]; 
foo(v); 

Bu güvenlidir. v, x'a taşındığında, v artık kullanılamaz. Aynı şekilde, kodunuzda v1_iter artık döngüden sonra kullanılamaz.

Ancak değişmez bir değişkeni değiştirilebilen haline dönüştürebilir misiniz? değeri mut olarak ilan yeni değişkene taşındığı için

Hem parçacıkları çalışır. Bununla birlikte, bir değişken değişmez (veya değişebilir) olarak ilan edildiğinde, bu değişken tüm ömrü boyunca kalır ve bu değiştirilemez. Yani cevap hayır, ancak sahiplik semantiği, değişkenleri farklı değişkenlik garantileri ile değişkenler arasında hareket ettirmeyi mümkün kılar.