Почему закрытие шага не переходит во владение переменной? - PullRequest
0 голосов
/ 10 мая 2019

Язык программирования Rust говорит :

Если вы хотите, чтобы замыкание вступило во владение значениями, которые оно использует в среде, выможно использовать ключевое слово move перед списком параметров

Что я заметил в своем коде, так это то, что он не станет владельцем этих значений.Различия между моим кодом и приведенным примером следующие:

  • использование целого числа вместо Vec
  • , делающего x изменяемым вместо неизменяемого

Пример 1: Язык программирования Rust

fn main() {
    let x = vec![1, 2, 3];

    let equal_to_x = move |z| z == x;

    println!("can't use x here: {:?}", x);

    let y = vec![1, 2, 3];

    assert!(equal_to_x(y));
}

Пример 2: Мой код

fn main() {
    let mut x = 1;

    let equal_to_x = move |z| z == x;

    println!("can use x here: {:?}", x);

    let y = 1;

    assert!(equal_to_x(y));
}
  1. Почему пример 2 будет скомпилирован, а пример 1 - нет?

  2. A Почему владение x не перемещено, даже если я явно напишу move передзакрытия?Почему x доступен после перемещения в крышку?

1 Ответ

2 голосов
/ 10 мая 2019

Ответ дается в сообщении об ошибке вашего первого примера

error[E0382]: borrow of moved value: `x`
 --> src/main.rs:6:40
  |
2 |     let x = vec![1, 2, 3];
  |         - move occurs because `x` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
3 | 
4 |     let equal_to_x = move |z| z == x;
  |                      --------      - variable moved due to use in closure
  |                      |
  |                      value moved into closure here
5 | 
6 |     println!("can't use x here: {:?}", x);
  |                                        ^ value borrowed here after move

«движение происходит, потому что x имеет тип std::vec::Vec<i32>, который не реализует черту Copy»

Это означает, что когда тип реализует черту Copy (как это делает i32), перемещение копирует переменную в область действия замыкания.

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