可变参数接口

可变参数接口可以接受任意数目的参数。比如说 println 就可以,其参数的数目是由 格式化字符串指定的。

我们可以把之前的 calculate! 宏改写成可变参数接口:

  1. macro_rules! calculate {
  2. // 单个 `eval` 的模式
  3. (eval $e:expr) => {{
  4. {
  5. let val: usize = $e; // Force types to be integers
  6. println!("{} = {}", stringify!{$e}, val);
  7. }
  8. }};
  9. // 递归地拆解多重的 `eval`
  10. (eval $e:expr, $(eval $es:expr),+) => {{
  11. calculate! { eval $e }
  12. calculate! { $(eval $es),+ }
  13. }};
  14. }
  15. fn main() {
  16. calculate! { // 妈妈快看,可变参数的 `calculate!`!
  17. eval 1 + 2,
  18. eval 3 + 4,
  19. eval (2 * 3) + 1
  20. }
  21. }

输出:

  1. 1 + 2 = 3
  2. 3 + 4 = 7
  3. (2 * 3) + 1 = 7