В чем разница между `Some (& a) => a` и` Some (a) => * a` при сопоставлении с Option? - PullRequest
0 голосов
/ 26 июня 2018

Почему это проходит:

fn f(v: Vec<isize>) -> (Vec<isize>, isize) {
    match v.get(0) {
        Some(&a) => (v, a),
        _ => (v, 0)
    }
}

Детская площадка

но это не так?:

fn f(v: Vec<isize>) -> (Vec<isize>, isize) {
    match v.get(0) {
        Some(a) => (v, *a),
        _ => (v, 0)
    }
}

Детская площадка

error[E0505]: cannot move out of `v` because it is borrowed
 --> src/main.rs:7:21
  |
6 |     match v.get(0) {
  |           - borrow of `v` occurs here
7 |         Some(a) => (v, *a),
  |                     ^ move out of `v` occurs here

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

v.get(0) возвращает ссылку на элемент в векторе, поэтому вы соответствуете &isize. Vec теперь занято в руке матча.

В первом фрагменте кода вы копируете isize, поэтому Vec здесь не заимствуется. Во втором фрагменте Vec по-прежнему заимствован, поэтому вы не можете вывести его из области видимости.

Однако вы должны рассмотреть возможность использования if let или unwrap_or:

fn f(v: Vec<isize>) -> (Vec<isize>, isize) {
    let a = v.get(0).cloned();
    (v, a.unwrap_or(0))
}
** * 1017 1018 * Игровая площадка
fn f(v: Vec<isize>) -> (Vec<isize>, isize) {
    if let Some(&a) = v.get(0) {
        (v, a)
    } else {
        (v, 0)
    }
}

Детская площадка


Смотри также:

0 голосов
/ 26 июня 2018

В первом фрагменте, когда вы набираете 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)
    }
}

Детская площадка

Проверка заимствований не может быть идеальной, поэтому вы часто сталкиваетесь с немного противоречивыми вещами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...