に構造体に格納されているスタックに割り当てられたクロージャーを呼び出す:は、私はこのような構造体の閉鎖を格納していますラスト
#[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>
経由)ヒープ上の閉鎖を保存するために、これを解決するため、この唯一の方法は以下のとおりです。
ここでエラーメッセージがですか?なぜクロージャーを呼び出すのがそれを動かすのですか?おそらくそれを呼び出すと、関数自体は変更されません。
これは、読み込みに役立ちます。 structのconstインスタンスを作成したかったので、FnOnceの代わりに 'Fn'を使ってしまいましたが、この全体の応答は全体を理解するのに役立ちます。 – cderwin