2016-10-28 10 views
10

मैं जंग के बारे में एक किताब पढ़ रहा हूं, और Rust macros के साथ खेलना शुरू कर रहा हूं। सभी मेटाएरिएबल प्रकारों को समझाया गया है और पिछले एक को छोड़कर उदाहरण हैं - tt। पुस्तक के अनुसार, यह एक "एक टोकन पेड़" है। मैं उत्सुक हूं, यह क्या है और इसके लिए क्या उपयोग किया जाता है? क्या आप एक उदाहरण प्रदान कर सकते हैं?जंग मैट्रोज़ में टीटी मेटाएरिएबल प्रकार का क्या अर्थ है?

उत्तर

14

यह सुनिश्चित करने के लिए एक धारणा है कि मैक्रो इनोकेशन में जो कुछ भी है, वह (), [] और {} जोड़े से सही ढंग से मेल खाता है।

उदाहरण के लिए

, निम्नलिखित कार्यक्रम के लिए:

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

टोकन पेड़ होगा:

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

यह एक पेड़ जहां सरल टोकन (fn, main आदि) पत्तियां हैं रूपों, और कुछ भी (), [] या {} से घिरा हुआ एक सबट्री है। ध्यान दें कि ( टोकन पेड़ में अकेले दिखाई नहीं देता है: संबंधित ) से मेल खाने के बिना ( से मिलान करना संभव नहीं है।

उदाहरण के लिए:

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

अच्छी व्याख्या और उदाहरण के लिए धन्यवाद, बस मुझे जो चाहिए! –

संबंधित मुद्दे