gpt4 book ai didi

rust - 在 Rust 中,如何从导出的 crate 宏中引用 crate 中的函数?

转载 作者:行者123 更新时间:2023-11-29 08:17:15 30 4
gpt4 key购买 nike

我正在尝试编写一些调试辅助宏。所以我创建了一个 crate 来容纳所有这些,并使用 phase(plugin) 在外部引用该 crate :

#[cfg(test)]
#[phase(plugin)]
extern crate debugging;

成功将宏导出到 crate 中。

但是,对于其中一些工具,我想从箱子中调用函数,例如:

#[macro_export]
macro_rules! trace(
{$($arg:tt)*} => {
{
extern crate debug;
let s = ::macros::logger(); // <---- This!
let _ = s.write_line(format_args!(::std::fmt::format, $($arg)*).as_slice());
}
};
)

使用全局命名空间,即。::macros::logger 如果将宏放入 macros.rs 并从 crate 的 crate root 中导入,则::macros::logger 工作。

但是,当宏必须从它自己的 crate 调用时,我在这里试图实现的是同一件事。

如果宏正确展开,我相信:

let s = ::crate_name::logger();

将是这样做的方式,但是带有宏的 crate 不能以这种方式通过名称来引用自己。它会产生如下错误:

src/macros.rs:52:15: 52:20 error: failed to resolve. Maybe a missing `extern crate debugging`?
src/macros.rs:52 let s = ::debugging::logger();
^~~~~
src/macros.rs:49:1: 56:2 note: in expansion of trace!
src/file.rs:26:11: 26:29 note: expansion site

...最后,我们完全清楚我要做什么:

crate debugging:
lib.rs
fn logger()
macros.rs
macro_rules! trace(...) // <--- Trying to figure out what to put here...

crate foo:
lib.rs
#[phase(plugin)] extern crate debugging;
fn test_thing() {
trace!("{}", ...); // <--- So debugging::logger() is invoked here
}

那么,有什么方法可以从宏中做到这一点吗?

最佳答案

目前,正确的做法是使用这样的绝对路径,然后在原始包中进行一些重新导出,以便路径解析。

即在 lib.rs 中放置

mod debugging {
pub use logger;
}

将顶层函数 logger 重新导出为 debugging::logger。正在做的工作使这更理智,例如$crate 扩展为宏来自的包的名称(当在外部使用时),或者什么都不扩展(当在内部使用时);这不一定是最终设计,但它正在改进。

关于rust - 在 Rust 中,如何从导出的 crate 宏中引用 crate 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25907800/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com