Я храню замыкание в структуры, как это:Вызов Stack-Обозначенная Закрытие хранящегося в структуре в Rust
#[derive(Clone)]
struct S<'a> {
func: &'a FnOnce() -> u32
}
fn main() {
let s = S { func: &|| 0 };
let val = (s.func)();
println!("{}", val);
}
Когда я компилирую, s.func
не может быть перемещен, чтобы выполнить сам. Я понимаю, почему он не может быть перемещен (а именно, что это только ссылка и что его размер неизвестен во время компиляции), но не знаю, почему он вообще перемещается - это просто из-за того, что замыкания реализуются через черты?
Вот сообщение об ошибке:
error[E0161]: cannot move a value of type std::ops::FnOnce() -> u32:
the size of std::ops::FnOnce() -> u32 cannot be statically determined
--> main.rs:8:15
|
8 | let val = (s.func)();
| ^^^^^^^^
error[E0507]: cannot move out of borrowed content
--> main.rs:8:15
|
8 | let val = (s.func)();
| ^^^^^^^^ cannot move out of borrowed content
error: aborting due to 2 previous errors
ли это единственный способ решить эту проблему, чтобы сохранить закрытия в куче (с помощью Box<FnOnce() -> u32>
)? И почему вызов закрывает его? Предположительно, вызов его не мутирует сама функция.
Это помогает загружать, спасибо. Я закончил использование 'Fn' вместо' FnOnce', потому что я хотел создать экземпляр const структуры, но весь этот ответ помогает тонне понять все это. – cderwin