将crate导入const块

时间:2017-06-16 18:15:52

标签: rust

我正在尝试编写一个为结构实现#[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特有的问题吗?你知道有什么方法可以解决这个问题吗(如果我不建议使用我使用的模式,可能会采用不同的方法来生成程序宏代码吗?

2 个答案:

答案 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;