Appearance
4.4 const fn
函数可以用 const 关键字修饰,这样的函数在编译阶段被编译器执行,返回值也会作为常量进入程序的代码中。
const fn 的主要用途有以下几个方面:
在编译时计算常量表达式:const fn 可以用来在编译时计算常量表达式。由于这类函数的返回值是常量,所以可以在编译时就直接将其值嵌入到代码中,从而提高代码的执行效率。 示例如下:
rustconst fn cube(num: usize) -> usize { num * num * num } fn main() { const DIM : usize = cube(2); const ARR : [i32; DIM] = [0; DIM]; println!("{:?}", ARR); }
cube
函数接受数字参数,它会返回一个数字,而且这个返回值本身可以用于给一个 const 常量做初始化,const 常量又可以当成一个常量数组的长度使用。对比与宏的优劣:和宏一样,const fn 可以接受参数并进行计算,但与宏不同的是,const fn 无需使用反射技术,因此编译器能够保证 const fn 的类型安全性和性能。
常量泛型:使用 const fn 可以定义常量泛型,这对一些需要固定值的场景非常有用。使用 const_fn 定义常量泛型可以提高代码的复用性和可读性。
rustconst fn square<T: Into<i32>>(input: T) -> i32 { let x = input.into(); x * x } const SQUARE_OF_3: i32 = square(3); const SQUARE_OF_4: i32 = square(4);
在 const fn 中使用if
、if let
和match
,这有助于在 const fn 中使用条件语句:
rust
// Use of if statement in const function.
const fn even(number: i32) -> i32 {
if number %2 == 0 {
number
} else {
number + 1
}
}
// Use of match statement in const function.
const fn even_no (number: i32) -> i32 {
match number {
2 => number,
_ => number + 1 ,
}
}
const DIGIT: i32 = 9;
const RESULT: i32 = even(DIGIT);
const RESULT_MATCH: i32 = even_no(DIGIT);
fn main() {
println!("The result of const function with if statement: {}", RESULT);
println!("The result of const function with match statement: {}", RESULT_MATCH);
}
还可以在 const fn 中使用 while、while let 和 loop 循环、使用&&
和||
操作符等。
总之,const fn 是 Rust 语言中的一个非常实用的特性,能够在编译期提升代码效率和安全性。