宏来营救!
#![cfg_attr(feature = "const-fn", feature(const_fn))]
#[cfg(not(feature = "const-fn"))]
macro_rules! maybe_const_fn {
($($tokens:tt)*) => {
$($tokens)*
};
}
#[cfg(feature = "const-fn")]
macro_rules! maybe_const_fn {
($(#[$($meta:meta)*])* $vis:vis $ident:ident $($tokens:tt)*) => {
$(#[$($meta)*])* $vis const $ident $($tokens)*
};
}
maybe_const_fn! {
#[allow(unused)] // for demonstration purposes
pub fn very_complicated_logic(a: u8, b: u8) -> u8 {
internally_complicated_logic(a, b)
}
}
maybe_const_fn! {
fn internally_complicated_logic(a: u8, b: u8) -> u8 {
a * b
}
}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(feature = "const-fn")]
#[test]
fn use_in_const() {
const ANSWER: u8 = very_complicated_logic(1, 2);
drop(ANSWER);
}
#[test]
fn use_in_variable() {
let answer: u8 = very_complicated_logic(1, 2);
drop(answer);
}
}
连同这个一起
Cargo.toml
[features]
const-fn = []
因为宏只能扩展到完整的语法片段(即宏不能简单地扩展到
const
),我们必须将整个函数包装在宏中,并使其某些部分未被解析,以便可以注入
在适当的地方。然后,解析器可以将整个内容解析为函数定义。
常量
vis
匹配器(
available since Rust 1.30.0