2016-10-28 100 views

回答

14

這是一個引入的概念,以確保無論在宏調用中是否正確匹配(),[]{}對。

例如,對於下面的程序:

fn main() { 
    println!("Hello world!"); 
} 

令牌樹將是:

  • fn
  • main
  • ()
  • { println!("Hello world!"); }
    • println
    • !
    • ("Hello world!")
      • "Hello world!"
    • ;

這形成了一個樹枝上,簡單的記號(fnmain等)是樹葉,以及任何由()[]{}包圍有一個子樹。請注意,(不會單獨顯示在令牌樹中:無法匹配(而不匹配相應的)

例如:

macro_rules! { 
    (fn $name:ident $params:tt $body:tt) => { /* … */} 
} 

將與$name → main$params →()$body → { println!("Hello world!"); }匹配上述功能。

令牌樹是要求最低的元變量類型:它匹配任何東西。它經常被用在具有「不真正關心」部分的宏中,特別是在具有「頭部」和「尾部」部分的宏中。例如,println!宏具有匹配($fmt:expr, $($arg:tt)*)的分支,其中$fmt是格式字符串,而$($arg:tt)*表示「所有其餘」,並且僅轉發到format_args!。這意味着println!不需要知道實際的格式並與其進行復雜的匹配。

+0

感謝您的好解釋和例子,正是我需要的! –