Rust 将板条箱导入常量块

Rust 将板条箱导入常量块,rust,Rust,我正在尝试编写一个过程宏,它为一个结构实现一个#[derivate()]特性。在生成的实现代码中,我需要使用 为了避免多板条箱导入,根据我在其他板条箱代码(即Serde)中读取的内容,我将生成的代码放入一个const IMPL_xxx_FOR_xxx:()={/*generated code*/}块,但无法编译 我能够用以下代码复制我的问题 const BLOCK_1: () = { extern crate anymap; use anymap::AnyMap; }; con

我正在尝试编写一个过程宏,它为一个结构实现一个
#[derivate()]
特性。在生成的实现代码中,我需要使用

为了避免多板条箱导入,根据我在其他板条箱代码(即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");
}
我得到的编译错误如下:

错误[E0432]:未解析的导入`anymap::anymap`
-->src/main.rs:3:9
|
3 |使用anymap::anymap;
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?
错误[E0432]:未解析的导入`anymap::anymap::anymap`
-->src/main.rs:9:9
|
9 |使用anymap::anymap;
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?

这是一个具体的问题吗?你知道有什么方法可以解决这个问题吗(如果不推荐我使用的模式,可能包括生成过程宏代码的不同方法?

我可以在操场上简单地使用

const A: () = {
    extern crate core;
    use core::option::Option;
};

fn main() {}
但是,似乎只有
use
语句被破坏,我仍然可以使用core中的项,但每次我都必须明确地命名它们:

const A: () = {
    extern crate core;
    do_stuff!(core::option::Option)
};
原因是
use
语句通常假定一条相对于根的路径,并且无法显式地命名所处的块(
self
引用当前模块)

这里有一个更好的解决方法-正如我前面所说的,Rust使用
self
引用当前模块,因此您只需在代码块中放入一个模块,然后让
use
语句引用
self

在您的情况下,它将是:

const BLOCK_1: () = {
    mod inner {
        extern crate anymap;
        use self::anymap::AnyMap;
    }
};

关于使这个过程宏工作的具体问题,建议的解决方案是将所需的板条箱作为包含派生宏(或包含我试图导出的类)的板条箱的一部分重新导出使用类似于
pub extern claiter anymap
的东西,然后使用
use::anymap::anymap;

感谢@Djzin提供的这些元素。因此,如果使用过程宏时确实中断了使用,那么管理导入的最佳方法是什么?可以做的一件事是将代码放入模块中,然后使用
use self::anymap::a导入nymap
。您仍然可以将模块放在常量中。谢谢。我会试试的