क्या Rust संरचना में चरों को आरंभ करने का एक तेज़ / छोटा तरीका है?


102

निम्नलिखित उदाहरण में, मैं खेतों की घोषणा में संरचना में प्रत्येक क्षेत्र के लिए एक मूल्य निर्दिष्ट करना पसंद करूंगा। वैकल्पिक रूप से, यह प्रभावी रूप से प्रत्येक फ़ील्ड के लिए एक अतिरिक्त स्टेटमेंट लेता है ताकि फ़ील्ड को एक मान दिया जा सके। सभी मैं करना चाहता हूँ करने के लिए डिफ़ॉल्ट मान असाइन करना है जब संरचना तत्काल है।

क्या ऐसा करने का एक अधिक सफल तरीका है?

struct cParams {
    iInsertMax: i64,
    iUpdateMax: i64,
    iDeleteMax: i64,
    iInstanceMax: i64,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

impl cParams {
    fn new() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}

जवाबों:


161

आप Defaultविशेषता को लागू करके अपनी संरचना के लिए डिफ़ॉल्ट मान प्रदान कर सकते हैं । defaultसमारोह अपने वर्तमान कैसा दिखेगा newसमारोह:

impl Default for cParams {
    fn default() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}

तब आप केवल गैर-डिफ़ॉल्ट मान देकर संरचना को तुरंत बदल सकते हैं:

let p = cParams { iInsertMax: 10, ..Default::default() };

आपकी डेटा संरचना में कुछ छोटे बदलावों के साथ, आप स्वतः व्युत्पन्न डिफ़ॉल्ट कार्यान्वयन का लाभ उठा सकते हैं। यदि आप #[derive(Default)]डेटा संरचना पर उपयोग करते हैं, तो कंपाइलर आपके लिए एक डिफ़ॉल्ट फ़ंक्शन बनाएगा जो प्रत्येक फ़ील्ड को उसके डिफ़ॉल्ट मान से भरता है। डिफ़ॉल्ट बूलियन मान गलत है, डिफ़ॉल्ट अभिन्न मान 0 है।

पूर्णांक का डिफ़ॉल्ट मान 0 होना यहां एक समस्या है क्योंकि आप चाहते हैं कि पूर्णांक फ़ील्ड डिफ़ॉल्ट रूप से -1 हो। आप एक नए प्रकार को परिभाषित कर सकते हैं जो -1 के डिफ़ॉल्ट मान को लागू करता है और i64आपकी संरचना में इसके बजाय इसका उपयोग करता है । (मैंने ऐसा परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए)।

हालाँकि, मैं आपके डेटा संरचना को बदलने और Option<i64>इसके बजाय उपयोग करने का सुझाव दूंगा i64। मुझे आपके कोड का संदर्भ नहीं पता है, लेकिन ऐसा लगता है कि आप विशेष अर्थ "अनंत" का प्रतिनिधित्व करने के लिए -1 के विशेष मूल्य का उपयोग कर रहे हैं, या "कोई अधिकतम नहीं है"। जंग में, हम Optionवैकल्पिक रूप से मौजूद मूल्य का प्रतिनिधित्व करने के लिए एक का उपयोग करते हैं। -1 हैक के लिए कोई ज़रूरत नहीं है। एक विकल्प Noneया तो हो सकता है या Some(x)जहां x आपके i64यहां होगा। यह भी एक अहस्ताक्षरित पूर्णांक हो सकता है अगर -1 केवल नकारात्मक मूल्य था। डिफ़ॉल्ट Optionमान है None, इसलिए प्रस्तावित परिवर्तनों के साथ, आपका कोड इस तरह दिख सकता है:

#[derive(Default)]
struct cParams {
    iInsertMax: Option<u64>,
    iUpdateMax: Option<u64>,
    iDeleteMax: Option<u64>,
    iInstanceMax: Option<u64>,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

let p = cParams { iInsertMax: Some(10), ..Default::default() };

1
धन्यवाद, मैं एक त्वरित पढ़ा था, लेकिन मैं बेहतर समझने के लिए फिर से पढ़ूँगा। "प्राकृतिक" चूक जो कुछ भाषाओं का उपयोग करती है जैसे कि मेरा मानना ​​है कि शून्य, असत्य, "", इत्यादि, मेरे अनुरूप होगी। मैं समझता हूं कि हल करने के लिए मेरी छोटी "समस्या" की तुलना में व्यापक प्रभाव हैं। राज्य की योग्यता। "IVal: i64 = 0", मेरी व्यापक आवश्यकताओं को हल करेगा, लेकिन मुझे लगता है कि ऐसा होने वाला नहीं है। "# [व्युत्पन्न (डिफ़ॉल्ट)]" को मेरी अधिकांश इच्छाओं को हल करना चाहिए। मैं अनिश्चित हूं कि मैंने अपने परीक्षण कार्यक्रम में -1 का उपयोग क्यों किया, लेकिन इसकी जरूरत (ऐतिहासिक) नहीं है। यह बहुत उपयोगी होगा (आईएमएचओ) सीटू में एक मान निर्दिष्ट करने में सक्षम होने के लिए जहां क्षेत्र परिभाषित किया गया है।
ब्रायन ओह

9
@BrianOh, tangentially, "संरचनात्मक क्षेत्रों के लिए डिफ़ॉल्ट मान" (जैसे कुछ struct Foo { val: i64 = 0 }) प्रस्तावित किया गया है और इसलिए बाद के संस्करणों में दिखाई दे सकता है।
हियून

यह अच्छा होगा कि अगर आईएमओ लागू किया जाए - "स्ट्रक्चर फू {...."। मैंने आपके द्वारा सुझाए गए ढांचे का उपयोग किया, जैसा कि मेरे प्रश्न में लिखे गए और डिफ़ॉल्ट के साथ संरचना का उपयोग करके किया गया है। यह निश्चित रूप से मेरे लिए बेहतर है और कहीं अधिक संक्षिप्त है। वाक्यविन्यास से अपरिचित होने के नाते, एक छोटी सी समस्या जो मुझे थी वह सभी चूक के लिए वाक्यविन्यास नहीं जान रही थी। IE: मैंने "= cParams {iInsertMax: 10, ..Default :: default ()}?" का उपयोग किया है, लेकिन मैं वास्तव में "iInstanceMax" भी डिफ़ॉल्ट होना चाहता हूं। IMO यह "# [व्युत्पन्न (डिफ़ॉल्ट)]" संरचना का हिस्सा बनने के लिए बेहतर होगा, लेकिन मुझे लगता है कि वैकल्पिक सूट संकलक को बेहतर बनाता है।
ब्रायन ओह

2
इसके लिए बहुत धन्यवाद। IMHO डिफॉल्ट डिफ़ॉल्ट होना चाहिए। अर्थात। मुझे नहीं लगता कि डिफ़ॉल्ट: डिफ़ॉल्ट इत्यादि को निर्दिष्ट करना आवश्यक होना चाहिए, आदि मुझे यह भी लगता है कि उन क्षेत्रों को एक मान निर्दिष्ट करने में सक्षम होना चाहिए जहां वे परिभाषित किए गए हैं। यह सिर्फ मेरे सरल दृष्टिकोण से है, और मुझे एहसास है कि रस्ट को सुरक्षित बनाने के लिए डिज़ाइन किया गया है, और यह कि मेरा बहुत व्यापक दृष्टिकोण है। जब कोई भाषा सीख रहा है (या कम से कम मुझे), तो वर्तमान कार्यान्वयन थोड़ा बोझिल लगता है। जंग एक सरल भाषा आईएमएचओ नहीं है, और जितना अधिक संभव है कि इसे कम से कम मेरे लिए बेहतर बनाने के लिए संभव हो सके।
ब्रायन ओह

2
क्या Defaultकिसी संरचना के लिए कार्यान्वयन करते समय सभी क्षेत्रों के लिए चूक को परिभाषित करना आवश्यक है ?
मैथ्यू स्टीवेन्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.