Ответ 1
Когда вы используете оператор индекса ([]
), вы получаете фактический объект в месте индекса. Вы не получаете ссылку, указатель или копию. Поскольку вы пытаетесь связать этот объект с привязкой let
, Rust немедленно пытается переместить (или скопировать, если реализован признак Copy
).
В вашем примере env::args()
является итератором String
, который затем собирается в Vec<String>
. Это находящийся в собственности вектор принадлежащих строк, а принадлежащие строки не могут автоматически копироваться. Перемещение из Vec
недопустимо, так как оно оставит его в недопустимом состоянии - один элемент будет удален, остальные - нет.
Вы можете использовать привязку let ref
, но более идиоматической альтернативой является обращение к индексированному объекту (обратите внимание на символ &
):
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
let ref dir = &args[1];
// ^
}
Для вашей конкретной проблемы вы также можете просто использовать Iterator::nth
:
use std::env;
fn main() {
let dir = env::args().nth(1).expect("Missing argument");
}