একই প্রকল্পের অন্য ফাইল থেকে একটি মডিউল কীভাবে অন্তর্ভুক্ত করবেন?


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

বর্তমান প্রকল্প থেকে একটি মডিউল কীভাবে প্রকল্পের মূল ফাইলটিতে অন্তর্ভুক্ত করা যায় তার একটি তুচ্ছ উদাহরণ রয়েছে?



উত্তর:


237

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
পুনঃটুইট করেছেন ক্রিশ্চিয়ানস্মিট না, তারা বিভিন্ন জিনিস। ফাইলের মধ্যে টান দেওয়ার 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... আমি কীভাবে এটি করব?
হেমন গান্ধী

মেইন.আরস ব্যতীত অন্য কোনও ফাইল থেকে ভাইবোন .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();
}

Reexport এই 'কৌতুক' ব্যবহার ছিল fn। ফাইল এটা ছিল নামেই#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;
Arek বাল

এটি গ্রহণযোগ্য উত্তর ইমো হওয়া উচিত
হোমম বাহরানী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.