2014-07-23 4 views
6

मैं निम्नलिखित की तरह कुछ करने में सक्षम हो प्यार होता:क्या जंगली मैक्रो लिखना संभव है जो एक फ़ंक्शन/विधि हस्ताक्षर में विस्तारित होगा?

macro_rules! impl_a_method(
    ($obj:ident, $body:block) => (
     fn a_method(foo: Foo, bar: Bar, baz: Baz) -> $obj $body 
    ) 
) 

// Implementation would look like: 

impl_a_method!(MyType, { 
    MyType { 
     foo: foo.blah(), 
     bar: bar.bloo(), 
     baz: baz.floozy(), 
    } 
}) 

मेरे वास्तविक दुनिया उदाहरण सुविधाओं बहुत बड़ा हस्ताक्षर जो मैं 30+ विभिन्न प्रकार के अनूठे तरीके से लागू करने के लिए है के साथ तरीकों।

मैं ऊपर मैक्रो को कुछ इसी तरह की कोशिश की है, फिर भी मैं त्रुटियों जहां rustc समझता है foo, bar और baz विस्तार स्थल पर अनसुलझे नाम में चलाने (हालांकि मुझे यकीन है कि मैक्रो घोषणा lexically उपयोग से पहले आती है हूँ)।

क्या ऐसा कुछ करना संभव है?

यदि नहीं, तो क्या आप ऐसे दृष्टिकोण की अनुशंसा कर सकते हैं जो कुछ समान प्राप्त करे?

उत्तर

5

मैक्रो स्वच्छता के कारण यह संभव नहीं है। मैक्रो बॉडी में पेश किए गए किसी भी पहचानकर्ता को मैक्रो कॉल साइट पर किसी भी पहचानकर्ता से अलग होने की गारंटी है।

macro_rules! impl_a_method(
    ($obj:ty, ($_foo:ident, $_bar:ident, $_baz:ident), $body:expr) => (
     fn a_method($_foo: Foo, $_bar: Bar, $_baz: Baz) -> $obj { $body } 
    ) 
) 

केवल एक चीज आप वास्तव में यहाँ की बचत कर रहे लिख रहा है प्रकार:

impl_a_method!(MyType, (foo, bar, baz), { 
    MyType { 
     foo: foo.blah(), 
     bar: bar.bloo(), 
     baz: baz.floozy(), 
    } 
}) 

यह इस मैक्रो द्वारा किया जाता है: आप सभी पहचानकर्ता खुद है, जो कुछ हद तक मैक्रो के प्रयोजन खारिज कर देता है प्रदान करने के लिए विधि पैरामीटर के।

+0

अच्छा जवाब, बस कह रहा है कि मैं जंग के मैक्रोज़ के तरीके के प्रशंसक नहीं हूं। मैक्रोज़ का पूरा बिंदु यह है कि वे अंधेरे से पाठ को प्रतिस्थापित करते हैं, और "मैक्रो स्वच्छता" एक ऑक्सीमोरोन होता है। यह सिर्फ मुझे और अधिक वाक्यविन्यास से निपटने का कारण बन रहा है, जबकि मुझे कभी-कभी सी – sudo

+3

"मैक्रो हाइजीन" में खतरनाक सामान करने में कोई परेशानी नहीं है, वास्तव में एक बहुत अच्छी तरह से परिभाषित विचार है: https://en.wikipedia.org/wiki/Hygienic_macro – solidsnack

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