2015-01-12 4 views
34

Ben Rust ile oynuyorum ve bu kod ile ilk komut satırı argümanı erişmeye çalışıyorum:"Endekslenmiş içerikten çıkamaz" ne demektir?

use std::env; 

fn main() { 
    let args: Vec<_> = env::args().collect(); 
    let dir = args[1]; 
} 

Ve bu hatayı alıyorum: Ben let ref dir bunu değiştirirseniz

error[E0507]: cannot move out of indexed content 
--> src/main.rs:5:15 
    | 
5 |  let dir = args[1]; 
    |   --- ^^^^^^^ cannot move out of indexed content 
    |   | 
    |   hint: to prevent move, use `ref dir` or `ref mut dir` 

, derler ama ne olup bittiğini bilmiyorum. Birisi "endeksli içerik" in ne anlama geldiğini açıklayabilir mi?

cevap

34

Bir dizin operatörü ([]) kullandığınızda, dizin nesnesindeki asıl nesneyi alırsınız. Bir referans, işaretçi veya kopya almazsınız. Bu nesneyi bir let bağlayıcısına bağlamaya çalıştığınız için, Rust hemen hareket etmeyi dener (veya Copy özelliğinin uygulanmış olması durumunda kopyalayın). Örnekte

, env::args() sonra Vec<String> içine toplanır String s Yineleyicinin. Bu sahip olunan dizelerin sahip olunan bir vektörüdür ve sahip olunan dizeler otomatik olarak kopyalanamaz. Vec'dan çıkmak geçersiz bir durumda bırakılacağından izin verilmez - bir öğe taşınır, diğerleri değil.

Sen bağlayıcı bir let ref kullanabilirsiniz, ancak daha deyimsel alternatif endeksli nesnesine bir başvuru almaktır (& sembolü dikkat edin): belirli sorun için

use std::env; 

fn main() { 
    let args: Vec<_> = env::args().collect(); 
    let ref dir = &args[1]; 
    //   ^
} 

şunları da yapabilirsiniz sadece Iterator::nth kullanın:

use std::env; 

fn main() { 
    let dir = env::args().nth(1).expect("Missing argument"); 
} 
+1

ne dizisi kendi ve dizideki tek bir değer sahipliğini almak istediğiniz (ve arr sahipliğini tüketmek durumunda) Ay? – Thayne

+1

Eğer bir "Vec" ise, "remove" yöntemini kullanabilirsiniz, aksi takdirde 'bir değere sahip bir değere sahip olabilirsiniz ::. –