2016-02-11 9 views
6

मैं एक जंग प्रोग्राम को कई फाइलों में विभाजित करना चाहता हूं, लेकिन mod का उपयोग मुझे main.rs के अलावा फ़ाइलों से उसी निर्देशिका में फ़ाइलों का संदर्भ देने की अनुमति नहीं देता है।क्या मैं जंग में मॉड्यूल "किनारे" शामिल कर सकता हूं?

उदाहरण के लिए, अगर मैं एक ही फ़ोल्डर में main.rs, game.rs, और matrix.rs है, मैं game.rs या matrix.rs से main.rs में एक mod game; या mod matrix; साथ संदर्भित कर सकते हैं structs/कार्य करता है। मैं mod matrix जैसे बयान के साथ game.rs से matrix.rs संदर्भित नहीं कर सकता।

मैंने कई संसाधनों को देखा है और उनमें से सभी में केवल पेड़ जैसे मॉड्यूल संरचनाएं हैं जो एक दूसरे का संदर्भ नहीं देती हैं। क्या जंग में एक दूसरे में फाइलों से structs/कार्यों का उपयोग करना संभव है, या नियमों के खिलाफ है? यदि हां, तो जंग क्यों नहीं करते हैं?

+0

[इस उत्तर] पर एक नज़र डालें (http://stackoverflow.com/a/22597760/994206)। यह [ट्यूटोरियल] में भी शामिल है (http://static.rust-lang.org/doc/master/book/crates-and-modules.html) – Mokosha

उत्तर

11

modमॉड्यूल घोषणा है। यह निर्देश एक मॉड्यूल और इसकी सभी सामग्री की घोषणा करता है। ऐसा ही होता है कि ये सामग्री किसी अन्य फ़ाइल में स्थित हो सकती है। तो यह: के बाद से mod एक मॉड्यूल की एक घोषणा है

mod game { 
    // game.rs contents 
} 

mod matrix { 
    // matrix.rs contents 
} 

स्वाभाविक रूप से, आप एक ही मॉड्यूल के लिए इसे कई बार ऐसा नहीं कर सकते:

mod game; 
mod matrix; 

मोटे तौर पर इस के बराबर है। यही कारण है, आप कोशिश करते हैं और

mod game { 
    mod matrix; 
    ... 
} 

mod matrix; 

की तरह कुछ लिख सकते हैं लेकिन, जैसा कि आप देख सकते हैं, matrix और game::matrix अलग मॉड्यूल हैं, और स्वाभाविक रूप से उनके संबंधित फाइलों को अलग अलग रास्तों की आवश्यकता है rustc, अगर वे बाहरी हैं।

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

// game.rs 
use matrix; 

जाहिर है, इस के लिए काम करने के लिए matrix टोकरा जड़ में mod साथ घोषित किया जाना चाहिए:

तो, क्रम game से matrix को संदर्भित करने में आप इसे use की जरूरत है।

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

mod foo { 
    mod bax { 
     ... 
    } 
    mod baz { 
     ... 
    } 
} 
mod bar { 
    mod qux { 
     mod zux { 
      ... 
     } 
    } 
} 

आप केवल एक ही फ़ाइल है, तो आप आसानी से कैसे mod और use निर्देशों काम करेगा देख सकते हैं , और मॉड्यूल के बीच संबंध स्पष्ट होना चाहिए।

और अब आप केवल तस्वीर के लिए तथ्य यह है कि अगर एक मॉड्यूल mod name; में की तरह, एक शरीर के बिना घोषित किया जाता है, इसकी सामग्री भरी हुई है कि या तो name.rs या name/mod.rs से, जो कुछ भी उपलब्ध है जोड़ने की जरूरत है। हालांकि, पूरी तस्वीर थोड़ी सी नहीं बदलती है - ये अभी भी नेस्टेड मॉड्यूल हैं जो हमेशा को नेस्टेड mod निर्देशों के साथ एक एकल स्रोत फ़ाइल के रूप में प्रदर्शित किया जा सकता है। वास्तव में, cargo rustc -Z unstable-options --pretty=normal बाहरी स्रोत फ़ाइलों के सभी मॉड्यूल को एक दस्तावेज़ में इकट्ठा करने के बाद, इस फ़ॉर्म में अपने क्रेट को प्रिंट करेगा। मैं जटिल मॉड्यूल संरचना के साथ कुछ crates पर यह आदेश चलाने का सुझाव देता हूं यह देखने के लिए कि यह अभ्यास में कैसा दिखता है।

+0

मेरे लिए mod की समझ सी या सीपीपी के बराबर है # नाम या मोड या name.rs की तलाश करने के लिए कुछ खोज क्षमताओं के साथ निर्देश शामिल करें, लेकिन हो सकता है कि मैं subtleties से चूक गया हो। –

+4

@XavierT। सी/सी ++ और जंग के बीच दो प्रमुख अंतर, सबसे पहले, जंग में एक संकलन इकाई सी/सी ++ (एक क्रेट, जो एक या अधिक .rs फ़ाइलों और एक या अधिक मॉड्यूल के अनुरूप होती है, बनाम एक से अधिक है। ऑब्जेक्ट फ़ाइल, जो पाठक शामिल हेडर के साथ बिल्कुल एक .c/.cpp फ़ाइल से मेल खाती है), और दूसरा, कि जंग मॉड्यूल में वास्तव में नामस्थान और encapsulation प्रदान करते हैं, जो सी के लिए सच नहीं है और सी ++ के लिए केवल आंशिक रूप से सच है (जहां नामस्थान मौजूद हैं , लेकिन संकलन इकाइयों से बंधे नहीं हैं और अमूर्त सीमाएं प्रदान नहीं करते हैं)। –

+0

आह हाँ, नामस्थान भी महत्वपूर्ण है! –

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

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