2015-03-12 8 views
7

क्या इसे जंग में कई "उपयोग" बयान घोषित करने के लिए बुरी शैली माना जाता है? मैं एक सी ++ प्रोग्रामर हूं जिसने हाल ही में जंग की कोशिश करना शुरू कर दिया। एक बात मैंने देखा है जब मैं जंग कोड की समीक्षा करता हूं यह है कि कई जंग कार्यक्रमों में कार्यक्रम के शीर्ष पर use कथन का एक गुच्छा होगा। सी ++ से आ रहा है, यह using namespace std का उपयोग करने के लिए विशेष रूप से हेडर फाइलें बनाते समय निराश था, लेकिन ऐसा लगता है कि मैंने देखा है कि अधिकांश जंग कार्यक्रमों में ऐसा नहीं लगता है। तो निम्न में से कौन सा मामूली उदाहरण बेहतर जंग प्रोग्रामिंग शैली माना जाता है? यदि आप बाइनरी प्रोग्राम बनाम मॉड्यूल बना रहे हैं तो क्या यह बदलता है? और क्यों?जंग "उपयोग" बनाम सी ++ "नामस्थान का उपयोग कर"

use std::sync::Arc; 
use std::sync::Mutex; 
use std::thread::Thread; 
use std::rand::random; 

fn main() { 
    let mut vec: Vec<char> = (0u8..10).map(|i| i as char).collect(); 

    let mut data = Arc::new(Mutex::new(vec)); 
    for i in 1usize..10 { 
     let data = data.clone(); 
     let thread = Thread::spawn(move || { 
      let mut data = match data.lock() { 
       Ok(guard) => guard, 
       Err(e)  => panic!("{}, was poisoned", e) 
      }; 
      data.push(random::<char>()); 
     }); 
    } 
} 

या यह ... सी # में

fn main() { 
    let mut vec: Vec<char> = (0u8..10).map(|i| i as char).collect(); 

    let mut data = std::sync::Arc::new(
          std::sync::Mutex::new(vec) 
             ); 
    for i in 1usize..10 { 
     let data = data.clone(); 
     let thread = std::thread::Thread::spawn(move || { 
      let mut data = match data.lock() { 
       Ok(guard) => guard, 
       Err(e)  => panic!("{}, was poisoned", e) 
      }; 
      data.push(std::rand::random::<char>()); 
     }); 
    } 
} 

उत्तर

13

आप शायद इसी तरह देखा नामों (use और using namespace) से उलझन में रहे हैं लिखने के लिए क्षमा करें। वास्तव में वे अर्थशास्त्र में बहुत अलग हैं।

सी में using namespace ++ वर्तमान क्षेत्र में एक नाम स्थान की पूरी सामग्री शामिल हैं, इसलिए, उदाहरण के लिए, आप cout बजाय std::cout उपयोग कर सकते हैं:

using namespace std; 

cout << "Hello!\n"; 

use जंग में, तथापि, केवल निर्दिष्ट नाम भी शामिल है , आप अभी भी अर्हता प्राप्त करने के जो आइटम आप वास्तव में बात कर रहे हैं ताकि:

use std::mem; 
use std::fmt::Debug; 

fn do_something<T: Debug>(t: T) { ... } 

fn main() { 
    let (mut x, mut y) = ...; 
    mem::swap(&mut x, &mut y); 
} 

नोट कैसे Debug क्वालिफायर लेकिनबिना प्रयोग किया जाता है 10 को अभी भी एक मॉड्यूल क्वालीफायर की आवश्यकता है, इसलिएजंग में using (बिना namespace) सी ++ में अधिक है। चूंकि use यह आयात करने में बहुत विशिष्ट है, इसे लगभग हमेशा उपयोग करने के लिए एक अच्छी शैली माना जाता है, इसलिए आपका पहला उदाहरण मूर्खतापूर्ण है।

वास्तव में, using namespace अधिक जंग में ग्लोब आयात की तरह है:

use std::*; 

और ग्लोब आयात वास्तव में कुछ हद तक हतोत्साहित किया जाता है। हालांकि, जंग संरचना संरचनाएं अधिक लचीली होती हैं जो सी ++ (विशेष रूप से, एसडीडी लाइब्रेरी में) द्वारा उपयोग की जाती हैं, इसलिए use std::* आपको पूरी मानक लाइब्रेरी, केवल शीर्ष-स्तरीय मॉड्यूल नहीं देगा। ग्लोब आयात कुछ अन्य स्थितियों में भी उपयोगी हैं, उदाहरण के लिए जब एक मॉड्यूल में नामों को फिर से निर्यात करना या एक मॉड्यूल में सभी लाइब्रेरी एक्सटेंशन लक्षणों को इकट्ठा करना।

और नहीं, यदि आप पुस्तकालय या निष्पादन योग्य लिख रहे हैं, तो इस पर ध्यान दिए बिना सम्मेलन नहीं बदले जाते हैं। जंग के पास शाब्दिक समावेशन के साथ सी/सी ++ के हेडर जैसे कुछ भी नहीं है, इसलिए प्रत्येक संकलन इकाई पूरी तरह से स्वतंत्र है और आपके पास कोई भी आयात हो सकता है - यह इसके उपयोगकर्ताओं को प्रभावित नहीं करेगा (जब तक कि ये pub use नहीं हैं)।

+5

ध्यान दें कि सी ++ में एकल नाम 'उपयोग' है, उदा। 'std :: cout का उपयोग करके; 'सी ++ में ठीक काम करता है। तो नहीं, 'उपयोग' एक ग्लोब आयात कथन नहीं है। दूसरी ओर नामस्थान का उपयोग करना, है, और यह इसके प्रभाव में काफी आत्म-व्याख्यात्मक है। – rubenvb

+0

आह, क्षमा करें, आप सही हैं। मैं सी ++ के साथ ज्यादा काम नहीं करता, इसलिए मुझे निश्चित रूप से गलत किया जा सकता है। –

0

using System; पूरी तरह से सामान्य है और जावा में, तुम भी import java.lang.*; लिखने के रूप में यह पहले से ही डिफ़ॉल्ट रूप से आयात किया जाता है की जरूरत नहीं है। और मुझे कई कथन लिखने में कोई दोष नहीं दिख रहा है - अगर आपको एक ही नाम से कुछ कॉल करने की आवश्यकता है, तो आप हमेशा अपने पूर्ण नाम के साथ पहचानकर्ताओं को कॉल कर सकते हैं, जैसा कि आपने अपने दूसरे कोड उदाहरण में किया था।

पी.एस .: एक राय संचालित जवाब ^^

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