我正在尝试编写一个为结构实现#[derive()]
特征的过程宏。在生成的实现代码中,我需要使用AnyMap
。
为了避免多箱导入,并根据我在其他一些包的代码(即Serde)中读到的内容,我将生成的代码放入const _IMPL_xxx_FOR_xxx : () = { /* generated code */ };
块,但无法编译。
我能够使用以下代码复制我的问题
const BLOCK_1: () = {
extern crate anymap;
use anymap::AnyMap;
};
const BLOCK_2: () = {
extern crate anymap;
use anymap::AnyMap;
};
fn main() {
println!("foo");
}
我得到的编译错误如下:
error[E0432]: unresolved import `anymap::AnyMap`
--> src/main.rs:3:9
|
3 | use anymap::AnyMap;
| ^^^^^^^^^^^^^^ Maybe a missing `extern crate anymap;`?
error[E0432]: unresolved import `anymap::AnyMap`
--> src/main.rs:9:9
|
9 | use anymap::AnyMap;
| ^^^^^^^^^^^^^^ Maybe a missing `extern crate anymap;`?
这是AnyMap
特有的问题吗?你知道有什么方法可以解决这个问题吗(如果我不建议使用我使用的模式,可能会采用不同的方法来生成程序宏代码吗?
答案 0 :(得分:2)
我可以使用简单的
在操场上复制这个const A: () = {
extern crate core;
use core::option::Option;
};
fn main() {}
但是,似乎只有use
语句被破坏了,我仍然可以使用核心中的项目,但我每次都必须明确命名它们:
const A: () = {
extern crate core;
do_stuff!(core::option::Option)
};
原因是use
语句通常假定相对于根的路径,并且无法明确命名您所在的块(self
不幸地引用当前模块)。< / p>
这是一个更好的解决方法 - 正如我之前所说,Rust使用self
来引用当前模块,因此您只需将一个模块放入代码块中,然后使用use
语句引用{ {1}}。
在你的情况下,它将是:
self
答案 1 :(得分:0)
关于使这个程序宏工作的具体问题,建议的解决方案是重新导出所需的包,作为包含派生宏(或包含我试图导出的类的那个)的包的一部分,使用像pub extern crate anymap
然后use <my_crate>::anymap::AnyMap;