Closed3

[Rust] FnOnce, FnMut, Fnメモ

mosumosu

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);
}
mosumosu

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);
}
mosumosu

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にクローズされました