【发布时间】:2021-04-21 17:04:29
【问题描述】:
我正在使用宏生成一个模块,该模块定义了一个函数,该函数返回用户传入的类型:
macro_rules! generate_mod {
($name:ident: $type:ty = $e:expr) => {
mod $name {
use super::*;
static DATA: $type = $e;
pub fn get() -> &'static $type
{
return &DATA;
}
}
}
}
如果用户传入非公开类型:
struct TestData(i32);
generate_mod!(foo: TestData = TestData(5));
我收到一个错误:
private type `TestData` in public interface
这令人困惑,因为 rustc 抱怨的 get 方法与 TestData 具有相同的可见性。如果我将get 定义中的pub 更改为pub(crate),一切正常。
I reread the module documentation 我仍然不明白这种行为。 pub 应该只使 get 可见一层(正如文档所解释的那样,您需要一个公开链到您想要访问的项目),并且只要包含 get 的模块不是 @987654336 @我看不出这种类型是如何逃脱的。 pub(crate) 使该函数对整个 crate 可见,这听起来在公开方面应该更糟糕,所以我完全不明白为什么 rustc 更喜欢它。
【问题讨论】:
-
可能会掩盖宏的东西,因为没有它就可以复制:playground
-
@kmdreko 不,如果有任何事情增加了我的困惑:)
标签: rust module encapsulation rust-macros