2015-01-12 15 views
34

tôi đang chơi với Rust, và tôi đang cố gắng để truy cập vào các đối số dòng lệnh đầu tiên với mã này:"Không thể di chuyển ra khỏi nội dung được lập chỉ mục" có nghĩa là gì?

use std::env; 

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

Và tôi nhận được lỗi này:

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` 

Nếu tôi thay đổi nó để let ref dir , nó biên dịch, nhưng tôi không lúng túng những gì đang xảy ra. Ai đó có thể giải thích "nội dung được lập chỉ mục" có nghĩa là gì?

Trả lời

34

Khi bạn sử dụng toán tử chỉ mục ([]), bạn sẽ nhận được đối tượng thực tế tại vị trí chỉ mục. Bạn không nhận được một tham chiếu, con trỏ hoặc sao chép. Vì bạn cố gắng ràng buộc đối tượng đó với một ràng buộc let, Rust ngay lập tức cố di chuyển (hoặc sao chép, nếu tính trạng Copy được triển khai).

Trong ví dụ của bạn, env::args() là trình lặp của String s sau đó được thu thập vào Vec<String>. Đây là một vector thuộc sở hữu của các chuỗi sở hữu và các chuỗi được sở hữu không tự động sao chép được. Di chuyển ra khỏi một Vec là không được phép vì nó sẽ để nó ở trạng thái không hợp lệ - một phần tử được di chuyển ra ngoài, những phần tử khác thì không.

Bạn có thể sử dụng một let ref ràng buộc, nhưng thay thế thành ngữ hơn là để có một tham chiếu đến đối tượng được lập chỉ mục (lưu ý các biểu tượng &):

use std::env; 

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

Đối với vấn đề cụ thể của bạn, bạn cũng có thể chỉ cần sử dụng Iterator::nth:

use std::env; 

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

Nếu tôi sở hữu mảng và muốn sở hữu một giá trị duy nhất trong mảng (và sử dụng quyền sở hữu ay)? – Thayne

+1

nếu đó là một 'Vec' bạn có thể sử dụng phương pháp' remove', nếu không bạn có thể 'mem :: thay thế' giá trị bằng một giá trị giả. –

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