【发布时间】:2020-03-26 01:27:12
【问题描述】:
我正在尝试在 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,以避免以后出现意外。那么,这将把我留在哪里?我目前可以在稳定状态下做什么,以及在 nightly、RFC 等方面的进展如何?我的下一个想法是研究宏,但我现在还不够舒服,不能在不知道它是否会取得成果的情况下进入那个兔子洞。我的最终目标是让这个数组成为一个常量,而不必手动输入 65 个值。
【问题讨论】:
-
你考虑过构建脚本吗? doc.rust-lang.org/cargo/reference/…
-
目前您甚至无法在夜间或任何时间运行此程序,no
f64functions areconst fn因为it can vary between platforms。我个人会包含某种文件,或者制作一个可以接受动态表达式并在编译时评估它们的 proc-macro。 -
@OptimisticPeach 你能给我一个可以在编译时评估动态表达式的 proc-macro 的小例子吗?
-
在这个用例中,构建脚本比 proc 宏要容易得多。
-
@loganfsmyth 如果您想要功劳,请添加您的构建脚本建议作为答案。我最终使用的是你的。
标签: arrays rust constants compile-time