serde 如何同时导出具有相同名称的特征和派生宏?

问题描述 投票:0回答:1

我正在尝试在

Foo
板条箱中实现一个特征
foo
,并在关联的板条箱
#[derive]
中实现一个同名的
foo-macros
proc-macro。

目的是拥有类似

serde::Deserialize
的东西,它既是一个特征,又是一个派生宏。

为了让用户更方便,我想将我的

foo-macros
板条箱的派生宏重新导出到我的
foo
板条箱中,就像
serde
一样

但是,当我尝试这样做时,我遇到了这个错误:

error[E0252]: the name `Foo` is defined multiple times

这是触发此操作的代码示例:

//! My `foo` crate `lib.rs`.

mod foo;

pub use foo::Foo;

#[cfg(feature = "derive")]
extern crate foo_macros;

#[cfg(feature = "derive")]
pub use foo_macros::Foo;

我不明白为什么这在

serde
中有效,但在我的情况下不起作用。我错过了什么?

rust rust-macros rust-proc-macros
1个回答
0
投票

您和

serde
可以拥有与类型同名的派生宏,因为派生宏占用与类型不同的命名空间

命名空间允许一个名称空间中出现的名称不会与另一名称空间中的相同名称发生冲突。

问题很可能是 Rust 编译器没有将

foo_macros::Foo
视为宏,因为存在一些错误阻止
foo_macros
解析或编译。正如已经指出的
Chayim Friedman 在您的帖子的评论中,有某些基本步骤来制作程序宏,例如派生宏。

© www.soinside.com 2019 - 2024. All rights reserved.