我有一個 Rust 庫包,其代碼結構如下:
pub struct Foo<X> {
x: X,
}
pub fn foo() -> Foo<u32> {
// ...
}
// private functions
特別是,雖然 lib 在Foo內部使用了不同的變體(例如Foo<u8>, Foo<u32>),但Foo僅在 lib 的公共 API 中作為Foo<u32>.
Foo像我目前所做的那樣公開泛型會使 lib 的公共 API 及其檔案變得不必要地復雜:用戶永遠不會Foo從庫中獲得不是Foo<u32>. 因此,我想以某種方式只公開和公開記錄Foo<u32>(最好使用不同的非通用名稱,例如Bar)并設為Foo私有。
我試過使用型別別名 ( type Bar = Foo<u32>),但似乎這些是自動擴展的cargo doc(并且它們似乎也沒有單獨的可見性)。
我可能會復制 的定義Foo<X>并呼叫它Bar,然后實作類似From<Foo<u32>>for 的東西Bar。但是,我對 的實際定義Foo<X>相當復雜,所以我想避免這種情況。
還有其他方法可以實作我的目標嗎?
uj5u.com熱心網友回復:
您可以按如下方式從父模塊公開型別:
mod prelude {
mod foo_mod {
pub struct Foo<X> {
x: X,
}
impl Foo<u32> {
pub fn foo() -> u32 {
32
}
}
impl Foo<u8> {
pub fn foo() -> u8 {
8
}
}
}
pub type FooBar = foo_mod::Foo<u32>;
}
fn main() {
use prelude::FooBar; // we can use this
use prelude::foo_mod::Foo; // we cannot use this
}
操場
uj5u.com熱心網友回復:
我不建議 Netwave 技巧,它欺騙了 Rust 的公共和私有規則,在我看來這樣的代碼不應該編譯。這種暴露Foo給用戶,因此實際上Foo是完全公開的,任何更改Foo 都是破壞性更改。
從你的問題描述來看:
特別是,雖然 lib 在內部使用了 Foo 的不同變體(例如 Foo、Foo),但 Foo 僅作為 Foo 出現在 lib 的公共 API 中。
解決方案是制作一個真正的包裝器:
pub struct FooBar {
foo: Foo<u32>,
}
impl FooBar {
pub fn some_pub_fct();
}
正如您所說,這就是您應該做的事情,因為用戶不需要泛型,所以您想要的是隱藏用戶的實作細節。這比泄漏私人專案的 netwave 技巧要好得多。這種方式很明顯,更改FooBar是一個破壞性更改,因為它被認為是一個公共專案。你可以隨心所欲地改變Foo。用戶贏,你贏。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/375647.html
