মরিচা মডিউল সিস্টেমটি আসলে অবিশ্বাস্যরূপে নমনীয় এবং ফাইলগুলিতে আপনার কোড কীভাবে কাঠামোবদ্ধ হয় তা লুকানোর সময় আপনি যে জাতীয় কাঠামো চান তা প্রকাশ করতে দেয়।
আমি মনে করি যে এখানে কীটি ব্যবহার করা pub use
হবে যা আপনাকে অন্য মডিউল থেকে শনাক্তকারীদের পুনরায় রফতানি করার অনুমতি দেবে। std::io
মরিচের ক্রেটে এর নজির রয়েছে যেখানে সাব-মডিউলগুলি থেকে কিছু প্রকারের ব্যবহারের জন্য পুনরায় রফতানি করা হয়std::io
।
সম্পাদনা (2019-08-25): উত্তরের নিম্নলিখিত অংশটি বেশ কিছু সময় আগে লেখা হয়েছিল। এটি ব্যাখ্যা করে যে কীভাবে rustc
একা এই জাতীয় মডিউল কাঠামো সেটআপ করতে হয়। আজ, কেউ সাধারণত বেশিরভাগ ব্যবহারের ক্ষেত্রে কার্গো ব্যবহার করবে। নিম্নলিখিতটি এখনও বৈধ হলেও এর কিছু অংশ (উদাঃ #![crate_type = ...]
) অদ্ভুত বলে মনে হতে পারে। এটি প্রস্তাবিত সমাধান নয়।
আপনার উদাহরণটি মানিয়ে নিতে, আমরা এই ডিরেক্টরি কাঠামো দিয়ে শুরু করতে পারি:
src/
lib.rs
vector.rs
main.rs
এখানে আপনার main.rs
:
extern crate math;
use math::vector;
fn main() {
println!("{:?}", vector::VectorA::new());
println!("{:?}", vector::VectorB::new());
}
এবং আপনার src/lib.rs
:
#[crate_id = "math"];
#[crate_type = "lib"];
pub mod vector;
এবং অবশেষে src/vector.rs
:
pub use self::vector_a::VectorA;
pub use self::vector_b::VectorB;
mod vector_b;
mod vector_a {
#[derive(Debug)]
pub struct VectorA {
xs: Vec<i64>,
}
impl VectorA {
pub fn new() -> VectorA {
VectorA { xs: vec![] }
}
}
}
আর এখানেই যাদু ঘটে। আমরা একটি উপ-মডিউলটি সংজ্ঞায়িত করেছি math::vector::vector_a
যা একটি বিশেষ ধরণের ভেক্টরের কিছু প্রয়োগ রয়েছে। তবে আমরা চাই না যে আপনার লাইব্রেরির ক্লায়েন্টরা vector_a
সাব-মডিউল রয়েছে সেদিকে খেয়াল রাখুক। পরিবর্তে, আমরা এটি math::vector
মডিউলে উপলব্ধ করতে চাই । এটি করা হয়ে থাকে pub use self::vector_a::VectorA
, যা vector_a::VectorA
বর্তমান মডিউলে শনাক্তকারীটিকে পুনরায় রফতানি করে ।
তবে আপনি কীভাবে এটি করবেন তা জিজ্ঞাসা করেছেন যাতে আপনি আপনার বিশেষ ভেক্টর বাস্তবায়নকে বিভিন্ন ফাইলগুলিতে রাখতে পারেন। এই mod vector_b;
লাইন কি করে। এটি vector_b.rs
মডিউলটি বাস্তবায়নের জন্য কোনও ফাইল সন্ধানের জন্য মরিচা সংকলককে নির্দেশ দেয় । এবং যথেষ্ট নিশ্চিত, আমাদের src/vector_b.rs
ফাইল এখানে :
#[derive(Debug)]
pub struct VectorB {
xs: Vec<i64>,
}
impl VectorB {
pub fn new() -> VectorB {
VectorB { xs: vec![] }
}
}
ক্লায়েন্টের দৃষ্টিকোণ থেকে, সত্য যে VectorA
এবংVectorB
দুটি ভিন্ন ফাইলের মধ্যে দুটি ভিন্ন মডিউল সংজ্ঞায়িত করা হয় সম্পূর্ণরূপে অস্বচ্ছ হয়।
আপনি যদি একই ডিরেক্টরিতে থাকেন তবে আপনার main.rs
এটি চালানো উচিত:
rustc src/lib.rs
rustc -L . main.rs
./main
সাধারণভাবে মরিচা বইয়ের "ক্রেটস এবং মডিউলস" অধ্যায়টি বেশ ভাল। এর প্রচুর উদাহরণ রয়েছে।
শেষ পর্যন্ত, মরিচা সংকলক স্বয়ংক্রিয়ভাবে আপনার জন্য উপ-ডিরেক্টরিতেও সন্ধান করে। উদাহরণস্বরূপ, উপরের কোডটি এই ডিরেক্টরি কাঠামোর সাথে অপরিবর্তিত কাজ করবে:
src/
lib.rs
vector/
mod.rs
vector_b.rs
main.rs
সংকলন এবং চালানোর আদেশগুলি একই থাকবে same