2013-10-29 6 views
46

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

क्या ऐसा करने का एक और संक्षिप्त तरीका है?

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, 
     } 
    } 
} 

उत्तर

73

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

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

फिर आप केवल गैर मूलभूत मूल्यों देकर struct का दृष्टांत कर सकते हैं:: default समारोह अपने वर्तमान new समारोह कैसा दिखेगा

let p = cParams { iInsertMax: 10, ..Default::default() }; 
अपने डेटा संरचना करने के लिए कुछ मामूली परिवर्तनों के साथ

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

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

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

#[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

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

+4

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

+0

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

संबंधित मुद्दे