Почему вызов FnOnce-закрытия является ходом? - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь передать замыкание в функцию, которая затем мутирует что-то переданное в нее в рамках функции. Исходя из моего текущего понимания Rust, это должно выглядеть примерно так:

pub fn call_something(callback: &FnOnce(&mut Vec<i32>)) {
    let mut my_vec = vec![0, 1, 2, 3, 4];
    callback(&mut my_vec);
}

Это приводит к следующим ошибкам:

error[E0161]: cannot move a value of type dyn for<'r> std::ops::FnOnce(&'r mut std::vec::Vec<i32>): the size of dyn for<'r> std::ops::FnOnce(&'r mut std::vec::Vec<i32>) cannot be statically determined
 --> src/lib.rs:3:5
  |
3 |     callback(&mut my_vec);
  |     ^^^^^^^^

error[E0507]: cannot move out of borrowed content
 --> src/lib.rs:3:5
  |
3 |     callback(&mut my_vec);
  |     ^^^^^^^^ cannot move out of borrowed content

Почему FnOnce называется ходом? Что мне здесь не хватает?

1 Ответ

0 голосов
/ 10 ноября 2018

Почему FnOnce называется ходом?

Поскольку это определение того, что делает замыкание FnOnce:

extern "rust-call" fn call_once(self, args: Args) -> Self::Output
//                              ^^^^

Сравните это с FnMut и Fn:

extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output
//                             ^^^^^^^^^
extern "rust-call" fn call(&self, args: Args) -> Self::Output
//                         ^^^^^

См. Также:


Возможно, вы хотите

pub fn call_something(callback: impl FnOnce(&mut Vec<i32>))

или

pub fn call_something<F>(callback: F)
where
    F: FnOnce(&mut Vec<i32>),

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

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