मेरे पास एक संरचना Foo
है जो बाह्य धारावाहिक प्रारूप का प्रतिनिधित्व करती है। Foo
में दर्जनों फ़ील्ड हैं, और हर समय अधिक जोड़े जाते हैं। खुशी से, सभी नए क्षेत्रों को समझदार डिफ़ॉल्ट मान होने की गारंटी है।जंग के ढांचे के सार्वजनिक क्षेत्रों को अद्यतन करना जिनमें निजी फ़ील्ड हैं
जंग एक struct बनाने मूलभूत मूल्यों का उपयोग कर और फिर कुछ ही चुने गए मानों अद्यतन करने के लिए एक अच्छा वाक्य रचना है:
Foo {
bar: true,
..Default::default()
}
इसी
, हम "के इस struct उसे भावी संस्करण में अधिक क्षेत्रों में हो सकता है विचार का प्रतिनिधित्व कर सकते "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 'नाम दें, इसे सार्वजनिक बनाएं और' # [डॉक्टर (छुपाएं)] '।लाइव उदाहरण: ['std :: io :: ErrorKind :: __ nonexhaustive'] (https://doc.rust-lang.org/src/std/up/src/libstd/io/error.rs.html#162- 168) – mcarton
@mcarton ध्यान दें कि 'std' थोड़ा सा विशेष है कि यह' __Nonexhaustive' संस्करण को अस्थिर होने की घोषणा कर सकता है, ताकि कॉलर सचमुच इसका उपयोग नहीं कर सकें यदि वे स्थिर जंग पर हैं। लाइब्रेरी लेखकों ने एक ही चाल को नियोजित किया (जो कुछ मैं निश्चित रूप से करता हूं) को सम्मेलन पर भरोसा करना चाहिए। (जो मुझे नहीं लगता कि अभ्यास में एक वास्तविक समस्या है, मैं सिर्फ एक पेडेंट हूं।) – BurntSushi5
@emk मैं ** ** ** 'फैंटॉमडाटा' के बारे में सीख रहा था। इस उपयोगी उदाहरण के लिए धन्यवाद! – ljedrz