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形式,分別定義了add和mul函數(shù)來計(jì)算加法和乘法。
main函數(shù)中,分別調(diào)用operation_alias和operation方法,計(jì)算a和b的值。
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形式,分別定義了add和mul函數(shù)來計(jì)算加法和乘法。
main函數(shù)中,分別調(diào)用get_operation_alias和get_operation方法,計(jì)算a和b的值。
0x04 小結(jié)
本節(jié)介紹了Rust高階函數(shù)的兩種形式——函數(shù)作為參數(shù)和函數(shù)作為返回值。當(dāng)函數(shù)作為參數(shù)或者作為返回值時(shí),建議使用type類型定義別名。
0x04 本節(jié)源碼
019 · StudyRust - 碼云 - 開源中國 (gitee.com)
下節(jié)預(yù)告—— 閉包。