RUST 學(xué)習(xí)日記 第19課 ——函數(shù)(二)

RUST 學(xué)習(xí)日記 第19課 ——函數(shù)(二)


0x00 回顧與開篇

上節(jié)初步了解了Rust的函數(shù),這節(jié)課繼續(xù)介紹Rust的高階函數(shù)——函數(shù)作為參數(shù)和函數(shù)作為返回值的兩種形式。

0x01 type定義別名

在Rust中,我們可以使用type關(guān)鍵字來為Rust的原始類型或者自定義類型定義別名。

示例代碼如下:

    type Int = i32;
    type Float = f32;
    type Double = f64;
    type Char = char;

    let a: Int = 3;
    let b: Float = 4.5;
    let c: Double = 134.6753453424234231;
    let d: Char = '我';

    dbg!(a);
    dbg!(b);
    dbg!(c);
    dbg!(d);

代碼運(yùn)行結(jié)果:

a = 3
b = 4.5
c = 134.6753453424234
d = '我'

上面的代碼可以看到,咱們把i32類型定義別名為Int類型,f32類型定義別名為Float類型,f64類型定義別名為Double類型,char類型定義別名為Char類型。

0x02 函數(shù)作為參數(shù)

當(dāng)Rust的函數(shù)作為參數(shù)時(shí),建議使用type關(guān)鍵字為函數(shù)指針類型定義別名。其目的是為了提升代碼的可讀性。下面我通過一個(gè)例子講解將函數(shù)作為參數(shù)的例子。

/// 函數(shù)聲明別名
type Calc = fn(i32, i32) -> i32;

/// 操作運(yùn)算(別名)
fn operation_alias(calc: Calc, a: i32, b: i32) -> i32 {
    return calc(a, b);
}

/// 操作運(yùn)算
fn operation(calc: fn(i32, i32) -> i32, a: i32, b: i32) -> i32 {
    return calc(a, b);
}

/// 加法
fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

/// 乘法
fn mul(a: i32, b: i32) -> i32 {
    return a * b;
}

fn main() {
    let a = 5;
    let b = 3;
    let add_result = operation_alias(add, a, b);
    let mul_result = operation(mul, a, b);

    dbg!(add_result);
    dbg!(mul_result);
}

代碼運(yùn)行結(jié)果:

add_result = 8
mul_result = 15

代碼解釋:

首先,使用type關(guān)鍵字為函數(shù)指針類型fn(i32,i32)->i32起一個(gè)別名為Calc。然后又定義了一個(gè)函數(shù)operation_alias,它有三個(gè)參數(shù),其中第一個(gè)參數(shù)為Calc類型,第二個(gè)和第三個(gè)參數(shù)是i32類型。緊接著又定義了一個(gè)函數(shù)operation,它也有三個(gè)參數(shù),與operation_alias一樣。不同的是,operation的第一個(gè)參數(shù)沒有使用別名,而是使用了原始的函數(shù)指針類型,在可讀性上可能比較差。最后按照fn(i32,i32)->i32形式,分別定義了addmul函數(shù)來計(jì)算加法和乘法。

main函數(shù)中,分別調(diào)用operation_aliasoperation方法,計(jì)算ab的值。

0x03 函數(shù)作為返回值

當(dāng)Rust的函數(shù)作為返回值時(shí),建議使用type關(guān)鍵字為函數(shù)指針類型定義別名。其目的是為了提升代碼的可讀性。下面我通過一個(gè)例子講解將函數(shù)作為返回值的例子。

/// 函數(shù)聲明別名
type Calc = fn(i32, i32) -> i32;

/// 根據(jù)字符串獲取函數(shù)(別名)
fn get_operation_alias(s: &str) -> Calc {
    if s == "add" {
        add
    } else {
        mul
    }
}

/// 根據(jù)字符串獲取函數(shù)
fn get_operation(s: &str) -> fn(i32, i32) -> i32 {
    if s == "add" {
        add
    } else {
        mul
    }
}

/// 加法
fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

/// 乘法
fn mul(a: i32, b: i32) -> i32 {
    return a * b;
}

fn main() {
    let a = 4;
    let b = 6;
    let add_result = get_operation_alias("add")(a, b);
    let mul_result = get_operation("mul")(a, b);

    dbg!(add_result);
    dbg!(mul_result);
}

代碼運(yùn)行結(jié)果:

add_result = 10
mul_result = 24

代碼解釋:

首先,使用type關(guān)鍵字為函數(shù)指針類型fn(i32,i32)->i32起一個(gè)別名為Calc。然后又定義了一個(gè)函數(shù)get_operation_alias,它只有一個(gè)參數(shù),根據(jù)參數(shù)返回指定的函數(shù)。緊接著又定義了一個(gè)函數(shù)get_operation,它也只有一個(gè)參數(shù),與get_operation_alias一樣。不同的是,get_operation的返回值使用了原始的函數(shù)指針類型,在可讀性上可能比較差。最后按照fn(i32,i32)->i32形式,分別定義了addmul函數(shù)來計(jì)算加法和乘法。

main函數(shù)中,分別調(diào)用get_operation_aliasget_operation方法,計(jì)算ab的值。

0x04 小結(jié)

本節(jié)介紹了Rust高階函數(shù)的兩種形式——函數(shù)作為參數(shù)和函數(shù)作為返回值。當(dāng)函數(shù)作為參數(shù)或者作為返回值時(shí),建議使用type類型定義別名。

0x04 本節(jié)源碼

019 · StudyRust - 碼云 - 開源中國 (gitee.com)

下節(jié)預(yù)告—— 閉包。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容