2015-09-08 28 views
9

में स्पष्ट आंशिक सरणी प्रारंभिकरण सी में, मैं int foo[100] = { 7, 8 }; लिख सकता हूं और मुझे [7, 8, 0, 0, 0...] मिल जाएगा।जंग

यह मुझे सरणी की शुरुआत में तत्वों के एक समूह के लिए प्रारंभिक मूल्यों को स्पष्ट रूप से और संक्षेप में चुनने की अनुमति देता है, और शेष को प्रारंभिक रूप से प्रारंभ किया जाएगा जैसे कि उनके पास स्थिर भंडारण अवधि थी (यानी उचित प्रकार के शून्य मान पर)।

क्या जंग में बराबर है?

उत्तर

12

मेरे सर्वोत्तम ज्ञान के लिए, ऐसा कोई शॉर्टकट नहीं है। हालांकि आपके पास कुछ विकल्प हैं।


प्रत्यक्ष वाक्य रचना

एक सरणी Copy प्रकार के साथ काम करता है को प्रारंभ करने के लिए प्रत्यक्ष वाक्य रचना (पूर्णांकों Copy हैं):

let array = [0; 1024]; 

सभी 0s के लिए 1024 तत्वों की एक सरणी initializes।

इस आधार पर, आप बाद में सरणी संशोधित कर सकते हैं:

let array = { 
    let mut array = [0; 1024]; 
    array[0] = 7; 
    array[1] = 8; 
    array 
}; 

नोट कोड का एक छोटा खंड पर अस्थिरता को अलग करने के एक ब्लॉक अभिव्यक्ति का उपयोग करने का चाल; हम इसे फिर से उपयोग करेंगे।


इटरेटर वाक्य रचना

वहाँ भी एक पुनरावर्तक से एक सरणी प्रारंभ करने का समर्थन किया गया है:

let array = { 
    let mut array = [0; 1024]; 

    for (i, element) in array.iter_mut().enumerate().take(2) { 
     *element = (i + 7); 
    } 

    array 
}; 

और तुम भी (वैकल्पिक) एक गैर-आरंभिकृत राज्य से, शुरू का उपयोग कर सकते हैं एक unsafe ब्लॉक:

let array = unsafe { 
    // Create an uninitialized array. 
    let mut array: [i32; 10] = mem::uninitialized(); 

    let nonzero = 2; 

    for (i, element) in array.iter_mut().enumerate().take(nonzero) { 
     // Overwrite `element` without running the destructor of the old value. 
     ptr::write(element, i + 7) 
    } 

    for element in array.iter_mut().skip(nonzero) { 
     // Overwrite `element` without running the destructor of the old value. 
     ptr::write(element, 0) 
    } 

    array 
}; 

कम इटरेटर वाक्य रचना

वहाँ एक छोटा रूप है, clone_from_slice के आधार पर है, यह हालांकि वर्तमान में अस्थिर है।

#![feature(clone_from_slice)] 

let array = { 
    let mut array = [0; 32]; 

    // Override beginning of array 
    array.clone_from_slice(&[7, 8]); 

    array 
}; 
2

यहाँ मैक्रो है

macro_rules! array { 
    ($($v:expr),*) => (
     { 
      let mut array = Default::default(); 
      { 
       let mut e = <_ as ::std::convert::AsMut<[_]>>::as_mut(&mut array).iter_mut(); 
       $(*e.next().unwrap() = $v);*; 
      } 
      array 
     } 
    ) 
} 

fn main() { 
    let a: [usize; 5] = array!(7, 8); 
    assert_eq!([7, 8, 0, 0, 0], a); 
}