Rustで関数を返す関数を作
何も変数をcaptureしていない場合
普通に使える
Rust v1.19.0以前はfeature(closure_to_fn_coercion)をつける必要があった
クロージャを返却する | 高度な関数とクロージャ - The Rust Programming Language 日本語版ではBox<>を使ってheap領域に確保しないと使えないと記述されているが、現在は問題ないっぽい
code:sample1.rs
fn f1() -> fn(i32) -> bool {
|i: i32| {
i == 2
}
}
fn main() {
let judge = f1();
for x in 1..10 {
println!("{}", judge(x));
}
}
変数を使っている場合
Box<>でheap領域に確保する必要がある
またmove closureでcaptureする変数の所有権を移動しておく
code:sample2.rs
fn f1() -> Box<dyn FnMut() -> i32> {
let mut counter = 0;
Box::new(move || {
counter+=1;
counter
})
}
fn main() {
let mut count = f1();
for _ in 1..10 {
println!("{}", count());
}
}
#Rust
#2021-05-27 01:09:19