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
。您仍然可以将模块放在常量中。谢谢。我会试试的