gpt4 book ai didi

rust - 将 crate 导入 const block

转载 作者:行者123 更新时间:2023-11-29 08:16:20 25 4
gpt4 key购买 nike

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

为了避免导入多个 crate,根据我在其他 crate 的代码(即 Serde)中阅读的内容,我将生成的代码放入 const _IMPL_xxx_FOR_xxx : () = {/* generated code */}; block ,但编译失败。

我能够使用以下代码重现我的问题

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 的问题吗? ?您是否知道解决此问题的任何方法(如果不推荐我使用的模式,可能包括生成过程宏代码的不同方法?

最佳答案

我可以简单地在 Playground 上复制它

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

fn main() {}

但是,似乎只有 use 语句被破坏了,我仍然可以使用核心中的项目,但每次我都必须明确地命名它们:

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

原因是 use 语句通常采用相对于根的路径,并且无法明确命名您所在的 block (self 指的是不幸的是当前模块)。

这是一个更好的解决方法 - 正如我之前所说,Rust 使用 self 来引用当前模块,因此您可以将一个模块放在代码块中,然后让 use 语句引用 self

在您的情况下,它将是:

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

关于rust - 将 crate 导入 const block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44595595/

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