【发布时间】:2022-01-03 05:56:57
【问题描述】:
我有一个 Rust 库 crate,其代码结构如下:
pub struct Foo<X> {
x: X,
}
pub fn foo() -> Foo<u32> {
// ...
}
// + private functions
特别是,虽然 lib 在内部使用 Foo 的不同变体(例如 Foo<u8>、Foo<u32>),但 Foo 仅作为 Foo<u32> 出现在 lib 的公共 API 中。
像我目前所做的那样公开通用Foo 会使lib 的公共API 及其文档变得不必要地复杂:用户永远不会从不是Foo<u32> 的库中获得Foo。因此,我想以某种方式只公开和公开记录Foo<u32>(最好使用不同的非通用名称,例如Bar)并将Foo设为私有。
我尝试过使用类型别名 (type Bar = Foo<u32>),但似乎它们会自动扩展为 cargo doc(而且它们似乎也没有单独的可见性)。
我可能会复制Foo<X> 的定义并将其命名为Bar,然后为Bar 实现类似From<Foo<u32>> 的东西。但是,我对Foo<X> 的实际定义相当复杂,所以我想避免这种情况。
还有其他方法可以实现我的目标吗?
【问题讨论】:
-
将模块公开给 super,然后从 super 公开具体类型作为别名。
-
@Netwave 这听起来很有趣,但我真的不知道该怎么做。您能否在答案中发布一个简短的示例?
-
我用这个想法添加了一个答案,它实际上并没有与
pub(super)一起使用,但背后的主要想法确实有效。
标签: generics rust access-modifiers