2014-10-06 24 views
23

मैं वास्तव में एक फ़ाइल (मॉड्यूल) से दूसरे में फ़ंक्शन (या आयात, इंजेक्ट या smth।) फ़ंक्शन को शामिल नहीं कर सकता।जंग मूल आयात (शामिल)

यहां उदाहरण है।

मैं

cd ~/projects 
cargo new proj --bin 
cd proj 
tree 
# output 
. 
| 
-- Cargo.toml 
-- src 
    | 
    -- main.rs 

के साथ एक नई परियोजना शुरू तो मैं main.rs को संशोधित करने और निम्न कोड के साथ एक नई फ़ाइल a.rs (src निर्देशिका के अंदर) बनाने के लिए:

// main.rs 
fn main() { println!("{}", a::foo()); } 


// a.rs 
pub fn foo() -> int { 42i } 

मैं cargo run के साथ इस परियोजना को चलाने

यहां मेरे पास दो त्रुटियां हैं:

  • src/main.rs: 2: 20: 2:26 त्रुटि: हल करने में विफल। अविकसित मॉड्यूल का उपयोग a
  • src/main.rs: 2: 20: 2:26 त्रुटि: अनसुलझा नाम a::foo

अब के लिए यह स्पष्ट है, मुझे किसी भी तरह a आयात करने की आवश्यकता है।

मैं main.rs

  • use a; करने के लिए एक पहली पंक्ति के रूप निम्नलिखित बातें जोड़ने की कोशिश की -> त्रुटि: अनसुलझे आयात (? हो सकता है आप a::* मतलब)
  • use a::*; -> त्रुटि: ग्लोब आयात बयान प्रयोगात्मक हैं और संभवतः छोटी गाड़ी
  • use a::foo; -> त्रुटि: अनसुलझा आयात a::foo। शायद एक लापता extern crate a?
  • extern crate a; use a::foo; -> त्रुटि: a
  • extern crate proj; use proj::a::foo; के लिए टोकरा नहीं मिल सकता है -> त्रुटि: के लिए proj

टोकरा नहीं मिल सकता है मैं the guide at rust-lang पढ़ लिया है, लेकिन अभी भी आयात करने के लिए कैसे को समझ नहीं सकता ।

उत्तर

23

एक मुख्य मॉड्यूल (main.rs, lib.rs, या subdir/mod.rs) में, आपको अन्य सभी मॉड्यूल के लिए mod a; लिखना होगा, जिसे आप अपनी पूरी परियोजना (या उपदीर में) में उपयोग करना चाहते हैं।

किसी अन्य भाग में, आप use a; या use a::foo;

लिखने की ज़रूरत आप केवल एक ही व्यक्ति इस से भ्रमित होने की से दूर कर रहे हैं, और यह निश्चित रूप से बेहतर करने के लिए संभव है, लेकिन मॉड्यूल प्रणाली में कोई परिवर्तन होगा "बहुत भ्रमित" के रूप में खारिज हो जाओ।

+1

तो 'बाहरी क्रेट' कब आवश्यक है? मैंने सोचा कि हर जंग फ़ाइल एक अलग क्रेट (संकलन की इकाई) थी। – voithos

+3

@voithos आपका main.rs या lib.rs और सभी फाइलें जो इसे 'mod' निर्देशों के माध्यम से पुनरावर्तक रूप से उलट देती हैं उन्हें एक क्रेट के रूप में संकलित किया जाएगा। यह संकलन की इकाई है। – Levans

+17

'लेकिन मॉड्यूल सिस्टम में किए गए किसी भी बदलाव को" बहुत भ्रमित "के रूप में अस्वीकार कर दिया जाएगा, मौजूदा मॉड्यूल सिस्टम" बहुत भ्रमित "है। – Qix

3

जंग में, वहाँ मॉड्यूल से निपटने के लिए कुछ कीवर्ड:

extern crate कार्गो और जंग के बीच की खाई को भर देता है। हम एक .rs फ़ाइल में कोड लिखते हैं, इस फ़ाइल को rustc के साथ संकलित किया जा सकता है। कार्गो बाहरी निर्भरताओं का प्रबंधन करेगा और rustc कॉल करेगा। extern crate ... लाइन कंपाइलर को इस नेमस्पेस को देखने के लिए कहती है, इसलिए यह स्पष्ट नहीं है।

  • जब घुंघराले ब्रेसिज़ के साथ प्रयोग किया है कि यह एक मॉड्यूल (नाम स्थान) वाणी:

    mod दो उपयोग हैं।

  • जब केवल एक नाम के साथ उपयोग किया जाता है, तो यह स्थानीय फाइल सिस्टम में मॉड्यूल की तलाश करेगा।

मॉड्यूल हो सकता है: विस्तार के साथ

  • फ़ाइलें एक फ़ाइल बुलाया mod.rs

use एक namespace आयात साथ

  • फ़ोल्डरों .rs। हमें यह घोषणा करने की आवश्यकता है कि इसका उपयोग करने से पहले हम क्या उपयोग करने जा रहे हैं। उपयोग खंड बहुत सख्त है, अगर हम use module1::moduleA;module1 से कोई अन्य मॉड्यूल उपलब्ध नहीं होंगे लेकिन moduleA उपलब्ध होंगे। एक तारांकन (*) मॉड्यूल के भीतर सबकुछ का उपयोग करने के लिए उपयोग किया जा सकता है: use module1::*;। सेट के रूप में अच्छी तरह से इस्तेमाल किया जा सकता: use module1::{moduleA, moduleB};

    एक उदाहरण:

    | main.rs 
    |- module1 
         |- mod.rs 
         |- moduleA.rs 
         |- moduleB.rs 
    

    mod.rs शामिल हैं:

    pub mod moduleA; // declare a sibling file 
    pub mod moduleA; // declare a sibling file 
    

    main.rs शामिल हैं:

    /// ====== 
    // use what Cargo downloaded 
    extern crate that_one_thing_i_need; 
    
    /// ====== 
    
    // add my other sources to the tree: 
    mod module1; 
    
    // some local stuff 
    mod local { 
        pub fn my_function() {} 
    } 
    
    // ====== 
    
    // make the symbols locally available: 
    use module1::moduleA::*; 
    use module1::moduleB::{functionX, moduleY, typeZ}; 
    
    // we still need to announce what stuff from the external crate 
    // we want to use: 
    // We can do local aliases that will be valid in this one file. 
    use that_one_thing_i_need::fancy_stuff as fs; 
    
    /// ====== 
    
    fn main() { 
        // we can use anything here from the namespaces we are using: 
        //  moduleA 
        //  functionX 
        //  moduleY 
        //  typeZ 
        //  fs 
    
        // We can access stuff by navigating from the outermost visible 
        // module name 
        local::my_function(); 
    } 
    

    चिह्न केवल प्रयोग करने योग्य हैं मॉड्यूल के भीतर से। यदि आप इस बाधा को पार करना चाहते हैं (यहां तक ​​कि स्थानीय रूप से घोषित मॉड्यूल पर भी) हमें कीवर्ड pub का उपयोग करके उन्हें सार्वजनिक करने की आवश्यकता है।