एक ही परियोजना से दूसरी फ़ाइल के मॉड्यूल को कैसे शामिल किया जाए?


130

इस गाइड का पालन ​​करके मैंने एक कार्गो प्रोजेक्ट बनाया।

src/main.rs

fn main() {
    hello::print_hello();
}

mod hello {
    pub fn print_hello() {
        println!("Hello, world!");
    }
}

जो मैं उपयोग करके चलाता हूं

cargo build && cargo run

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

मेरा प्रोजेक्ट ट्री कुछ इस तरह दिखता है

├── src
    ├── hello.rs
    └── main.rs

और फ़ाइलों की सामग्री:

src/main.rs

use hello;

fn main() {
    hello::print_hello();
}

src/hello.rs

mod hello {
    pub fn print_hello() {
        println!("Hello, world!");
    }
}

जब मैं इसे संकलित करता cargo buildहूं तो मुझे मिलता है

error[E0432]: unresolved import `hello`
 --> src/main.rs:1:5
  |
1 | use hello;
  |     ^^^^^ no `hello` external crate

मैंने संकलक के सुझावों का पालन करने की कोशिश की और इसे संशोधित main.rsकिया:

#![feature(globs)]

extern crate hello;

use hello::*;

fn main() {
    hello::print_hello();
}

लेकिन यह अभी भी बहुत मदद नहीं करता है, अब मुझे यह मिलता है:

error[E0463]: can't find crate for `hello`
 --> src/main.rs:3:1
  |
3 | extern crate hello;
  | ^^^^^^^^^^^^^^^^^^^ can't find crate

क्या परियोजना के मुख्य फ़ाइल में वर्तमान परियोजना से एक मॉड्यूल को शामिल करने का एक तुच्छ उदाहरण है?



जवाबों:


239

आपको mod helloअपनी hello.rsफ़ाइल की आवश्यकता नहीं है । किसी भी फाइल में कोड लेकिन क्रेट रूट ( main.rsनिष्पादन योग्य के लिए, lib.rsपुस्तकालयों के लिए) स्वचालित रूप से एक मॉड्यूल में नाम दिया गया है।

hello.rsअपने से कोड को शामिल करने के लिए main.rs, का उपयोग करें mod hello;। यह उस कोड तक विस्तारित हो जाता है जो hello.rs(जैसा कि आप पहले था) में है। आपकी फ़ाइल संरचना समान रहती है, और आपके कोड को थोड़ा बदलना होगा:

main.rs:

mod hello;

fn main() {
    hello::print_hello();
}

hello.rs:

pub fn print_hello() {
    println!("Hello, world!");
}

1
देर से सवाल यह भी काम नहीं करेगा अगर मैं इसे मॉड हैलो के बजाय हैलो के साथ निर्दिष्ट करूं?!
क्रिश्चियन श्मिट

16
@ChristianSchmitt नहीं, वे अलग-अलग चीजें हैं। फ़ाइल में खींचता है use, जबकि सिर्फ एक नाम स्थान की बात है mod। आप useउदाहरण के लिए, print_helloनामस्थान के साथ उपसर्ग किए बिना फ़ंक्शन को कॉल करने में सक्षम होने के लिए उपयोग करेंगे
रेनाटो ज़नोन

25

यदि आप नेस्टेड मॉड्यूल की इच्छा रखते हैं ...

जंग 2018

यह है अब आवश्यक फ़ाइल के लिए mod.rs(हालांकि यह अभी भी समर्थित है)। मुहावरेदार विकल्प फ़ाइल का नाम मॉड्यूल का नाम देना है:

$ tree src
src
├── main.rs
├── my
│   ├── inaccessible.rs
│   └── nested.rs
└── my.rs

main.rs

mod my;

fn main() {
    my::function();
}

my.rs

pub mod nested; // if you need to include other modules

pub fn function() {
    println!("called `my::function()`");
}

जंग 2015

आपको mod.rsअपने मॉड्यूल के समान नाम के फ़ोल्डर के अंदर एक फ़ाइल डालने की आवश्यकता है । उदाहरण के आधार पर जंग इसे बेहतर बताती है।

$ tree src
src
├── main.rs
└── my
    ├── inaccessible.rs
    ├── mod.rs
    └── nested.rs

main.rs

mod my;

fn main() {
    my::function();
}

mod.rs

pub mod nested; // if you need to include other modules

pub fn function() {
    println!("called `my::function()`");
}

4
मान लीजिए मैं से कुछ का उपयोग करना चाहता inaccessible.rsमें nested.rs... मुझे लगता है कि कैसे करना होगा?
हेमन गांधी

किसी फ़ाइल को। S फ़ाइल को main.rs के अलावा किसी अन्य फ़ाइल से एक्सेस करने के लिए, पथ विशेषता का उपयोग करें। तो, nested.rs के शीर्ष पर, निम्नलिखित जोड़ें: #[path = "inaccessible.rs"]और अगली पंक्ति पर:mod inaccessible;
माली


2
@ हामनगांधी इसे सबमॉड्यूल बनाने के mod inaccessible;लिए जोड़ते हैं , फिर रिश्तेदार मार्ग से सिबलिंग मॉड्यूल तक पहुंचते हैं । आपको यहां विशेषता की आवश्यकता नहीं है। my/mod.rsmynested.rssuper::inaccessible::function()path
आर्टिन

9

मुझे वास्तव में माली की प्रतिक्रिया पसंद है। मैं अपने मॉड्यूल घोषणाओं के लिए सुझाव का उपयोग कर रहा हूं। यदि कोई तकनीकी समस्या है तो कृपया इसमें झंकार करें।

./src
├── main.rs
├── other_utils
│   └── other_thing.rs
└── utils
    └── thing.rs

main.rs

#[path = "utils/thing.rs"] mod thing;
#[path = "other_utils/other_thing.rs"] mod other_thing;

fn main() {
  thing::foo();
  other_thing::bar();
}

utils / thing.rs

pub fn foo() {
  println!("foo");
}

other_utils / other_thing.rs

#[path = "../utils/thing.rs"] mod thing;

pub fn bar() {
  println!("bar");
  thing::foo();
}

इस 'ट्रिक' को fnउसी नाम से रीपेक्स करने के लिए इस्तेमाल करना था जिस फ़ाइल में यह था।#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;
अरे बाल

यह स्वीकृत उत्तर imo होना चाहिए
होमम बहारानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.