module - واجهة - وحدات الماكرو في الوورد




كيف يمكنني استخدام ماكرو عبر ملفات الوحدة النمطية؟ (2)

لديّ وحدتان في ملفات منفصلة داخل نفس الصندوق ، حيث تم تمكين macro_rules . أريد استخدام وحدات الماكرو المعرفة في وحدة نمطية واحدة في وحدة نمطية أخرى.

// macros.rs
#[macro_export] // or not? is ineffectual for this, afaik
macro_rules! my_macro(...)

// something.rs
use macros;
// use macros::my_macro; <-- unresolved import (for obvious reasons)
my_macro!() // <-- how?

لقد وصلت حاليًا إلى الخطأ المحول البرمجي " macro undefined: 'my_macro' " ... وهو أمر منطقي ؛ يعمل نظام الماكرو قبل نظام الوحدة النمطية. كيف يمكنني حل هذا؟


وحدات الماكرو داخل نفس الصندوق

#[macro_use]
mod foo {
    macro_rules! bar {
        () => ()
    }
}

bar!();    // works

إذا كنت تريد استخدام الماكرو في نفس الصندوق ، #[macro_use] الوحدة النمطية التي تم تعريفها بها إلى السمة #[macro_use] .

لا يمكن استخدام وحدات الماكرو إلا بعد تعريفها. هذا يعني أن هذا لا يعمل:

bar!();  // ERROR: cannot find macro `bar!` in this scope

#[macro_use]
mod foo {
    macro_rules! bar {
        () => ()
    }
}

وحدات الماكرو عبر الصناديق

لاستخدام macro_rules! الخاص بك macro_rules! الماكرو من الصناديق الأخرى ، يحتاج الماكرو نفسه إلى السمة #[macro_export] . يمكن use crate_name::macro_name; المستورد ثم استيراد الماكرو عبر use crate_name::macro_name; .

// --- Crate `util` ---
#[macro_export]
macro_rules! foo {
    () => ()
}


// --- Crate `user` ---
use util::foo;

foo!();

ملاحظة: تعيش وحدات الماكرو دائمًا في المستوى العلوي من الصناديق ؛ لذلك ، حتى لو كان foo داخل mod bar {} ، فلا يزال يتعين على صندوق user أن يكتب use util::foo; وعدم use util::bar::foo; .

(قبل Rust 2018 ، كان عليك استيراد ماكرو من الصناديق الأخرى عن طريق إضافة السمة #[macro_use] إلى الصندوق extern crate util; عبارة. وهذا من شأنه أن يستورد جميع وحدات الماكرو من util . بدلاً من ذلك ، يمكن أن يكون #[macro_use(cat, dog)] تستخدم لاستيراد cat dog وحدات الماكرو فقط. يجب ألا يكون بناء الجملة هذا ضروريًا بعد الآن.)

مزيد من المعلومات متاحة في The Rust Programming Language .


تؤدي إضافة #![macro_use] إلى الجزء العلوي من الملف الذي يحتوي على وحدات ماكرو إلى سحب جميع وحدات الماكرو إلى main.rs.

على سبيل المثال ، لنفترض أن هذا الملف يسمى node.rs:

#![macro_use]

macro_rules! test {
    () => { println!("Nuts"); }
}

macro_rules! best {
    () => { println!("Run"); }
}

pub fn fun_times() {
    println!("Is it really?");
}

سيبدو رئيسك في وقت ما كما يلي:

mod node;  //We're using node.rs
mod toad;  //Also using toad.rs

fn main() {
    test!();
    best!();
    toad::a_thing();
}

أخيرًا لنفترض أن لديك ملفًا يسمى toad.rs يتطلب أيضًا وحدات الماكرو هذه:

use node; //Notice this is 'use' not 'mod'

pub fn a_thing() {
  test!();

  node::fun_times();
}

لاحظ أنه بمجرد سحب الملفات إلى main.rs مع mod ، يمكن لبقية ملفاتك الوصول إليها من خلال use الكلمة الأساسية.





rust-macros