我有一個結構Foo
,它表示外部序列化格式。 Foo
有幾十個字段,並且所有時間都會添加更多字段。令人高興的是,所有新領域都保證有合理的默認值。更新具有私有字段的Rust結構的公共字段
鏽菌使用默認值創建一個結構,然後更新了幾個選擇的值一個漂亮的語法:
Foo {
bar: true,
..Default::default()
}
同樣,我們可以代表「這個結構可能在將來的版本更多領域的想法「使用類型爲PhantomData
的私人領域。
但如果我們結合這兩個成語,我們得到一個錯誤:
use std::default::Default;
mod F {
use std::default::Default;
use std::marker::PhantomData;
pub struct Foo {
pub bar: bool,
phantom: PhantomData<()>,
}
impl Default for Foo {
fn default() -> Foo {
Foo {
bar: false,
phantom: PhantomData,
}
}
}
}
fn main() {
F::Foo {
bar: true,
..Default::default()
};
}
這給了我們錯誤:
error: field `phantom` of struct `F::Foo` is private [--explain E0451]
--> <anon>:23:5
|>
23 |> F::Foo {
|> ^
從邏輯上講,我認爲這應該工作,因爲我們」只重新更新公共領域,這將是有用的習慣用法。另一種方法是支持類似的東西:
Foo::new()
.set_bar(true)
...這將變得繁瑣的幾十個領域。
我該如何解決這個問題?
將'phantom'重命名爲'__phantom',使其公開並且'#[doc(hidden)]'。現場示例:['std :: io :: ErrorKind :: __ Nonexhaustive'](https://doc.rust-lang.org/src/std/up/src/libstd/io/error.rs.html#162- 168) – mcarton
@mcarton請注意,'std'有一點特別之處在於它可以聲明'__Nonexhaustive'變體不穩定,因此如果調用者使用穩定的Rust時,字面上不會使用它。採用這種相同技巧的圖書館作家(這是我絕對要做的)必須依靠約定。 (我認爲這在實踐中並不是真正的問題,我只是一個學生。) – BurntSushi5
@emk我只是** **瞭解'PhantomData'。感謝這個有用的例子! – ljedrz