Rust چیست؟ آموزش کامل و جامع Rust
فهرست مطالب
Rust چیست؟
Rust یک زبان برنامهنویسی سیستمی است که توسط موزیلا توسعه یافته و برای ایمنی، همزمانی و عملکرد بالا طراحی شده است. این زبان جایگزینی مناسب برای C++ محسوب میشود و مشکلات رایج مانند race condition و memory leak را در زمان کامپایل تشخیص میدهد.
fn main() {
println!("سلام دنیا!");
let x = 42;
let name = String::from("Rust");
println!("عدد: {}, نام: {}", x, name);
}
تاریخچه Rust
Rust در سال 2006 به عنوان یک پروژه شخصی توسط گریسون هوآر، کارمند موزیلا آغاز شد. در سال 2009، موزیلا به طور رسمی از آن حمایت کرد و نسخه 1.0 در سال 2015 منتشر شد.
ساختار پایه Rust
برنامههای Rust از ساختار مشخص و منظمی پیروی میکنند. یک برنامه Rust معمولاً شامل توابع، متغیرها، تایپها و ماژولهاست.
// تعریف یک ماژول
mod math {
// تعریف یک تابع عمومی
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
}
// تابع اصلی برنامه
fn main() {
// تعریف متغیر
let x = 5;
let y = 10;
// فراخوانی تابع
let result = math::add(x, y);
println!("نتیجه جمع: {}", result);
}
مالکیت و قرضگیری در Rust
سیستم مالکیت Rust یکی از مهمترین ویژگیهای این زبان است که امنیت حافظه را بدون نیاز به garbage collector تضمین میکند.
قوانین اصلی مالکیت:
fn main() {
// String یک نوع داده با مالکیت است
let s1 = String::from("سلام");
let s2 = s1; // مالکیت از s1 به s2 منتقل میشود
// این خط کامپایل نمیشود چون s1 دیگر معتبر نیست
// println!("{}", s1);
// این خط درست است
println!("{}", s2);
// قرضگیری با رفرنس
let s3 = String::from("دنیا");
let len = calculate_length(&s3);
println!("طول '{}' برابر است با {}", s3, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
سیستم تایپ در Rust
Rust دارای یک سیستم تایپ قوی و ایستا است که در زمان کامپایل از بسیاری از خطاها جلوگیری میکند.
fn main() {
// تایپهای اصلی
let integer: i32 = 42;
let float: f64 = 3.14;
let boolean: bool = true;
let character: char = 'آ';
// تایپهای ترکیبی
let tuple: (i32, f64, char) = (42, 3.14, 'آ');
let array: [i32; 3] = [1, 2, 3];
// ساختارها
struct Point {
x: f64,
y: f64,
}
let point = Point { x: 0.0, y: 0.0 };
}
مدیریت خطا در Rust
Rust از دو نوع خطا پشتیبانی میکند: خطاهای قابل بازیابی (Result) و خطاهای غیرقابل بازیابی (panic).
use std::fs::File;
use std::io::ErrorKind;
fn main() {
// مدیریت خطا با Result
let file_result = File::open("file.txt");
let file = match file_result {
Ok(file) => file,
Err(error) => match error.kind() {
ErrorKind::NotFound => match File::create("file.txt") {
Ok(fc) => fc,
Err(e) => panic!("خطا در ایجاد فایل: {:?}", e),
},
other_error => panic!("خطا در باز کردن فایل: {:?}", other_error),
},
};
// روش سادهتر با unwrap_or_else
let file = File::open("file.txt").unwrap_or_else(|error| {
panic!("مشکل در باز کردن فایل: {:?}", error);
});
}
برنامهنویسی همزمان در Rust
Rust با سیستم مالکیت خود، امکان برنامهنویسی همزمان ایمن را فراهم میکند.
use std::thread;
use std::sync::mpsc;
fn main() {
// ایجاد یک کانال برای ارتباط بین thread ها
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let val = String::from("سلام از thread دیگر");
tx.send(val).unwrap();
});
// دریافت پیام از thread دیگر
let received = rx.recv().unwrap();
println!("دریافت شد: {}", received);
}
کار با Cargo
Cargo مدیر بسته و سیستم ساخت رسمی Rust است که مدیریت وابستگیها و ساخت پروژه را ساده میکند.
# ایجاد پروژه جدید
cargo new my_project
# ساخت پروژه
cargo build
# اجرای پروژه
cargo run
# بررسی خطاها بدون ساخت
cargo check
# ساخت نسخه بهینهسازی شده
cargo build --release
ماژولها و پکیجها
سیستم ماژول Rust به شما امکان میدهد کد خود را سازماندهی کرده و قابلیت استفاده مجدد را افزایش دهید.
// در فایل lib.rs
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// مسیر مطلق
crate::front_of_house::hosting::add_to_waitlist();
// مسیر نسبی
front_of_house::hosting::add_to_waitlist();
}
بهترین شیوههای کدنویسی Rust
رعایت اصول و الگوهای برنامهنویسی Rust به بهبود کیفیت و خوانایی کد کمک میکند:
۱. استفاده از نامگذاری استاندارد
استفاده از snake_case برای توابع و متغیرها، و PascalCase برای تایپها
۲. مدیریت صحیح خطاها
استفاده از Result و Option به جای unwrap در کد تولیدی
۳. مستندسازی کد
استفاده از doc comments برای توضیح عملکرد توابع و ماژولها
ابزارهای مفید برای کار با Rust
ابزارهای توسعه
– rust-analyzer: افزونه IDE برای کد Rust
– clippy: لینتر Rust
– rustfmt: فرمتکننده کد
– cargo-edit: ابزار مدیریت وابستگیها
محیطهای توسعه
– VS Code با افزونه rust-analyzer
– IntelliJ IDEA با افزونه Rust
– Sublime Text با پشتیبانی Rust
منابع یادگیری Rust (ادامه)
کتابها و دورههای آموزشی
–
Rust in Action
–
دورههای Udemy
–
تمرینهای عملی Exercism
پروژههای نمونه
use std::io;
fn main() {
println!("لطفاً نام خود را وارد کنید:");
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("خطا در خواندن ورودی");
let name = input.trim();
let greeting = create_greeting(name);
println!("{}", greeting);
}
fn create_greeting(name: &str) -> String {
format!("سلام {}! به دنیای Rust خوش آمدید!", name)
}
اکوسیستم Rust
اکوسیستم Rust شامل مجموعهای غنی از کتابخانهها و ابزارهاست که توسعه نرمافزار را تسهیل میکنند:
کتابخانههای محبوب
– Tokio: برای برنامهنویسی آسنکرون
– Serde: برای سریالایز و دسریالایز داده
– Actix: فریمورک وب
– Diesel: ORM برای کار با پایگاه داده
آینده Rust
Rust به سرعت در حال رشد است و شرکتهای بزرگی مانند Microsoft، Amazon و Google از آن استفاده میکنند. برخی از زمینههای کلیدی توسعه Rust عبارتند از:
زمینههای کاربرد
– توسعه سیستمهای عامل
– برنامهنویسی وب اسمبلی
– IoT و سیستمهای نهفته
– توسعه بلاکچین