Closed3
[Rust] FnOnce, FnMut, Fnメモ
FnOnce
- 関数側
- 1度しか実行できない
- 利用側
- 値を消費できる
- 値を変更できる
fn call(f: impl FnOnce(String)) {
println!("Call.");
f("RESPONSE".to_string());
f("RESPONSE".to_string()); // ERROR
}
fn main() {
let nums = vec![1, 2, 3];
let mut out = "default".to_string();
call(|response| {
println!("Response is {}", response);
for n in nums {
println!("{}", n);
}
out = "changed".to_string();
});
println!("Outer is {}", out);
}
FnMut
- 関数側
- 何度でも呼べる
- 利用側
- 値を消費できない
- 値の変更は可能
fn call(mut f: impl FnMut(String)) {
println!("Call.");
f("RESPONSE".to_string());
f("RESPONSE".to_string());
}
fn main() {
let nums = vec![1, 2, 3];
let mut out = "default".to_string();
call(|response| {
println!("Response is {}", response);
for n in &nums {
println!("{}", n);
}
out = "changed".to_string();
});
println!("Outer is {}", out);
}
Fn
- 関数側
- 何度でも使える
- クロージャが不変
- 利用側
- 値の消費ができない
- 値の変更ができない
fn call(f: impl Fn(String)) {
println!("Call.");
f("RESPONSE".to_string());
f("RESPONSE".to_string());
}
fn main() {
let nums = vec![1, 2, 3];
call(|response| {
println!("Response is {}", response);
for n in &nums {
println!("{}", n);
}
});
}
このスクラップは2023/02/23にクローズされました