Skip to content

4.4 const fn

函数可以用 const 关键字修饰,这样的函数在编译阶段被编译器执行,返回值也会作为常量进入程序的代码中

const fn 的主要用途有以下几个方面:

  1. 在编译时计算常量表达式:const fn 可以用来在编译时计算常量表达式。由于这类函数的返回值是常量,所以可以在编译时就直接将其值嵌入到代码中,从而提高代码的执行效率。 示例如下:

    rust
    const 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 常量又可以当成一个常量数组的长度使用。

  2. 对比与宏的优劣:和宏一样,const fn 可以接受参数并进行计算,但与宏不同的是,const fn 无需使用反射技术,因此编译器能够保证 const fn 的类型安全性和性能。

  3. 常量泛型:使用 const fn 可以定义常量泛型,这对一些需要固定值的场景非常有用。使用 const_fn 定义常量泛型可以提高代码的复用性和可读性。

    rust
    const 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 中使用ifif letmatch,这有助于在 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 语言中的一个非常实用的特性,能够在编译期提升代码效率和安全性。

Released under the MIT License