YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

Rustの関数ポインタを配列で扱う

関数ポインタの利用

fn double(n: i32) -> i32 {
    n + n
}

fn abs(n: i32) -> i32 {
    if n >= 0 {
        n
    } else {
        -n
    }
}

fn main() {
    // doubleの関数ポインタをfへ束縛
    let mut f: fn(i32) -> i32 = double;
    assert_eq!(f(-42), -84);
    // absの関数ポインタをfへ束縛
    f = abs;
    assert_eq!(f(-42), 42);
}

関数ポインタを配列に格納して利用

fn double(n: i32) -> i32 {
    n + n
}

fn abs(n: i32) -> i32 {
    if n >= 0 {
        n
    } else {
        -n
    }
}

fn main() {
    // 型推論があるため冗長だが、型も明記
    let calc_tbl: [fn(i32)->i32;2] = [double,abs];
    assert_eq!(calc_tbl[0](-42), -84);
    assert_eq!(calc_tbl[1](-42), 42);
}