来自于RustFest 2018 大会上Alex Crichton 和 David Tolnay两位大佬的轻演讲主题:Rust Quiz

rust-quiz源码在线练习和解答

视频

不得不说,两位大佬出的题非常具有迷惑性,一不留神就落入了陷阱。

Quiz 22:

下面这段代码输出什么?

macro_rules! m {
($a:tt) => { print!("1") };
($a:tt $b:tt) => { print!("2") };
($a:tt $b:tt $c:tt) => { print!("3") };
($a:tt $b:tt $c:tt $d:tt) => { print!("4") };
($a:tt $b:tt $c:tt $d:tt $e:tt) => { print!("5") };
($a:tt $b:tt $c:tt $d:tt $e:tt $f:tt) => { print!("6") };
($a:tt $b:tt $c:tt $d:tt $e:tt $f:tt $g:tt) => { print!("7") };
}

fn main() {
m!(-1);
m!(-1.);
m!(-1.0);
m!(-1.0e1);
m!(-1.0e-1);
}

输出结果: 22222

考察要点:

  1. 声明宏模式分支匹配规则
  2. Rust如何对表达式进行词法分析

Quiz代码中定义了m!宏,通过该宏可以判断Rust如何对表达式进行解析。

在main函数中:

m!(-1),其中-1,会被Rust分词为两个独立词条(Token):-1。所以,宏调用会匹配到第二个模式条件分支,最终输出:2

Rust对于数字11.1.01.0e11.0e-1均会识别为一个词条。所以,剩余的4个宏调用,也同样会输出: 2

-永远都会被识别为独立的词条,比如下面这段代码:

fn main() {
let n = -3i32.pow(4);
println!("{}", n);
}

输出结果是:-81

点此查看 Rust Quiz 22

推荐阅读:

相关文章