rust 在循环中调用不同的泛型

v8wbuo2f  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(121)

虽然这是一个简单的例子,但是我有多个泛型函数,它们需要处理几十个可能的值,实际值直到运行时才知道,因为它是作为参数提供的。

#![feature(generic_const_exprs)]

fn generic_division<const DIVISOR: u64>(denominator: u64) -> u64 {
    denominator / DIVISOR
}

fn main() {
    let denominator = 12;
    for i in 1..5 {
        let dividend = match i {
            1 => generic_division::<1>(denominator),
            2 => generic_division::<2>(denominator),
            3 => generic_division::<3>(denominator),
            4 => generic_division::<4>(denominator),
            _ => panic!()
        };
        println!("{} / {} == {}", denominator, i, dividend);
    }
}

有比上面更好的方法吗?所有其他方法都遇到了const问题。

8gsdolmq

8gsdolmq1#

当你使用const泛型参数时,目的是保证参数在编译时是已知的。在这里传递运行时值甚至在语法上都是不可能的。如果你想确保你的函数可以被常量折叠,并且在需要的时候也接受运行时值,你可以使用const fn。让我们给予个例子。

// prefixing function with const
const fn const_divisor(value: u64, divisor: u64) -> u64 {
    value / divisor
}

// no difference compared to non const fn
fn main() {
    let denominator = 12;
    for i in 1..5 {
        let dividend = const_divisor(denominator, i);
        println!("{} / {} == {}", denominator, i, dividend);
    }
}

// the advantage of const fn is that you can use it in constants
const REAL_USECASE: u64 = const_divisor(1024, 46);

相关问题