В первом фрагменте, когда вы набираете Some(&a)
, вы не заимствуете v
, потому что a
копируется.
Во втором случае Some(a)
имеет тип Option<&isize>
, поэтому он содержит ссылку на v
. Когда вы пытаетесь переместить его, он вызывает ошибку. Если вы сначала скопируете его, а затем вернете пару, это сработает (однако вам нужна функция NLL ):
#![feature(nll)]
fn main() {
println!("{:?}", f(vec![1]))
}
fn f(v: Vec<isize>) -> (Vec<isize>, isize) {
match v.get(0) {
Some(a) => {
let a = *a; // v is no more borrowed
(v, a)
},
_ => (v, 0)
}
}
Детская площадка
Проверка заимствований не может быть идеальной, поэтому вы часто сталкиваетесь с немного противоречивыми вещами.