arrays - 在 Rust 中,我可以在不对值进行硬编码的情况下实例化我的 const 数组吗?编译时评估?

标签 arrays rust constants compile-time

我正在尝试在 Rust 中实例化一个数组。这是我可以在运行时执行的一种方法:

let mut t = [0_u32; 65];
for i in 0..t.len() {
    t[i] = ((i as f64).sin().abs() * 2.0_f64.powf(32.0)).floor() as u32;
}

然而,由于我永远不会改变这个数组的值,而且我会经常使用这些值,我认为这可能是一个很好的机会来探索 const 上的一些很酷的东西。编译时评估工作正在 Rust 中完成。我可以让它在编译时计算数组并​​将结果存储在程序数据中,这样它就可以在运行时立即运行。

我的第一步是创建常量数组。

const T: [u32; 65] = [0; 65];

嗯,这不好。我已经用全零实例化了它。那是不对的。接下来,我想也许我应该创建一个可以实例化数组的常量函数。

const fn sine_table() -> [u32; 65] {
    let mut t = [0_u32; 65];
    let mut i = 0;


    loop {
        if i > 65 {
            break;
        }

        // Do the math...
    }

    t
}

这就是我被卡住的地方。从我读到的内容来看,常量函数内的循环仍然只在夜间进行,我暂时尝试使用稳定的 Rust 以避免以后出现意外。那么,这让我何去何从?我目前可以在稳定的情况下做什么,以及在夜间、RFC 等中将有什么进展?我的下一个想法是研究宏,但我还不够舒服,无法在不知道它是否会产生成果的情况下进入那个兔子洞。我的最终目标是让这个数组成为一个常量,而不必手动输入 65 个值。

最佳答案

到目前为止,在 Rust Stable 上,这是不可能的(你需要 const fn 表达式才能在编译时工作)。

但幸运的是,此用例有一个“中间”解决方案(我也经常使用),即 lazy_static宏。

基本上它是一个惰性求值的运行时表达式,只在第一次访问时计算。

https://docs.rs/lazy_static/1.4.0/lazy_static/

使用此宏,您的代码将如下所示:

use lazy_static::lazy_static;

const SINE_TABLE_SIZE: usize = 65;
lazy_static! {
    pub static ref SINE_TABLE: [u32; SINE_TABLE_SIZE] = {
        let mut table = [0_u32; SINE_TABLE_SIZE];
        for i in 0..SINE_TABLE_SIZE {
            table[i] = ((i as f64).sin().abs() * 2.0f64.powf(32.)).floor() as u32;
        }

        table
    };
}

Rust Playground 示例链接:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=61146c5f7de2c9ee1cbcd724dd1a730f

免责声明:我不是 lazy_static 的作者,也不与他们有任何关系。

关于arrays - 在 Rust 中,我可以在不对值进行硬编码的情况下实例化我的 const 数组吗?编译时评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59121887/

相关文章:

arrays - 阵列逆时针旋转

arrays - 根据特定条件生成部分随机 bool 值数组

rust - 如何正确弃用一个 crate 特性

c# - 您将如何管理每个 c# 类的常量?

C++函数头匹配: how does matching work when const and templates are both involved?

javascript - JS - 列出以逗号分隔的数组

rust - 为什么 `Into` 没有发送/同步?

rust - 在 for 循环中使用正则表达式

java - 如何轻松地将配置存储在常量中?

c++ - 警告: "when type is in parentheses, array cannot have dynamic size"?的原因是什么