假设我们需要使用值声明一个固定大小的数组,其中数组的大小由一个常量定义,该常量可能会根据编译时设置而改变。
例如:
let my_array = expand_into_array!(j, ARRAY_SIZE, -v0[j] * f);
ARRAY_SIZE
是常量,例如:
const ARRAY_SIZE: usize = 3;
可以扩展为类似......
let my_array = [
{let j = 0; {-v0[j] * f}},
{let j = 1; {-v0[j] * f}},
{let j = 2; {-v0[j] * f}},
];
由于表达式是固定大小的数组,因此可以对有限数量的项目使用模式匹配...例如,最多32个。
是否可以根据常量整数编写一个扩展表达式 N 次的宏?
详情... 的
调查一下,我编写了一个定义数组的宏,然后将其填入,例如:
const ARRAY_SIZE: usize = 3;
macro_rules! expand_into_array {
($index_var:ident, $const_size:expr, $body:expr) => {
{
let mut tmp: [_; $const_size] = [0.0; $const_size];
for $index_var in 0..$const_size {
tmp[$index_var] = $body;
}
// TODO, check $body _never_ breaks.
tmp
}
}
}
pub fn negated_array(v0: &[f64; ARRAY_SIZE]) -> [f64; ARRAY_SIZE] {
expand_into_array!(j, ARRAY_SIZE, {
-v0[j]
})
}
这可以按预期工作,除了皱纹($body
表达式可以包含break
)。这没有问题。
然而,将数组初始化为0.0并未进行优化(更改此值会在运行时显示为更改:
cargo rustc --release -- --emit asm
我宁愿不使用unsafe { std::mem::uninitialized }
。
更新,从询问another question,似乎宏只能匹配文字,而不是常量。
所以这对于Rust中的宏来说根本不可能。