Traitها و Genericها در Rust

ایجاد شده توسط دکتر مصطفی جلیلی در آموزش برنامه نویسی Rust 13 ژوئن 2025
اشتراک گذاری

Traits و Genericها در Rust


Rust با ترکیب Traits (ویژگی‌ها) و Genericها (نوع‌های کلی)، قابلیت نوشتن کدی قابل‌توسعه، قابل‌استفاده مجدد و ایمن را فراهم می‌کند. این مفاهیم پایه‌ای در برنامه‌نویسی تابع‌محور و شیءگرای Rust هستند. در این بخش با تعریف و استفاده از Traitها، جنریک‌ها در توابع و ساختارها، Trait Boundها و Derive Macros آشنا می‌شویم.


مقدمه‌ای بر Traitها


Trait در Rust مشابه interface در زبان‌هایی مانند Java یا TypeScript است. Trait مجموعه‌ای از متدهایی است که یک نوع باید پیاده‌سازی کند تا آن Trait را داشته باشد.


تعریف یک Trait:


trait Greet {
fn say_hello(&self);
}

پیاده‌سازی Trait:


struct Person {
name: String,
}
impl Greet for Person {
fn say_hello(&self) {
println!("سلام، من {} هستم", self.name);
}
}
fn main() {
let p = Person { name: "Ali".to_string() };
p.say_hello();
}

Traitها به ما اجازه می‌دهند که رفتار مشترک را برای نوع‌های مختلف تعریف کنیم.


Generic Types در Struct و Function


با Genericها می‌توانیم کدی بنویسیم که با چند نوع مختلف کار کند، بدون نیاز به تکرار.


جنریک در توابع:


fn print_twice(item: T) {
println!("{:?} {:?}", item, item);
}



    - T یک نوع کلی است.

    - با Trait Bound مثل Debug محدود شده که فقط برای نوع‌هایی که Debug را پیاده‌سازی کرده‌اند مجاز است.


    جنریک در Structها:


    struct Point {
    x: T,
    y: T,
    }
    fn main() {
    let p1 = Point { x: 1, y: 2 };
    let p2 = Point { x: 1.5, y: 2.7 };
    }

    می‌توان از جنریک برای ساختارهای پیچیده‌تر و توابع ترکیبی هم استفاده کرد.


    Trait Bounds


    گاهی می‌خواهیم جنریک‌هایی بنویسیم که تنها نوع‌هایی را قبول کنند که خاصیت خاصی داشته باشند. این کار با Trait Bound انجام می‌شود.


    مثال:


    fn describe(item: T) {
    println!("مقدار: {}", item);
    }

    همچنین می‌توان از چند Trait استفاده کرد:


    fn process(item: T) {
    let copy = item.clone();
    println!("{:?}", copy);
    }

    Trait Bound به صورت where:


    برای خوانایی بیشتر:


    fn describe(item: T)
    where
    T: std::fmt::Display,
    {
    println!("مقدار: {}", item);
    }

    Derive Macros (مانند Debug، Clone)


    Rust برای بسیاری از Traitهای متداول، قابلیت خودکارسازی پیاده‌سازی دارد. با استفاده از #[derive(...)] می‌توان پیاده‌سازی را به کامپایلر سپرد.


    مثال:


    #[derive(Debug, Clone)]
    struct User {
    name: String,
    age: u8,
    }
    fn main() {
    let user = User {
    name: "Sara".to_string(),
    age: 30,
    };
    println!("{:?}", user); // چون Debug داریم
    let copy = user.clone(); // چون Clone داریم
    }

    Traitهایی مانند Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Default و... قابل استفاده هستند.


    جمع‌بندی


    در این بخش یاد گرفتیم:

    - چطور با Traitها رفتارهای مشترک تعریف کنیم.

    - با استفاده از Genericها توابع و ساختارهای چندمنظوره بنویسیم.

    - چگونه با Trait Boundها مشخص کنیم که چه نوع‌هایی مجازند.

    - و چطور با Derive Macros مثل #[derive(Debug)] کار را ساده‌تر کنیم.


    در بخش بعدی وارد مباحث سطح پایین‌تری مثل Smart Pointerها و حافظه Unsafe خواهیم شد.

    نظرات (0)

    اشتراک گذاری

    این پست را با دیگران به اشتراک بگذارید

    تنظیمات GDPR

    When you visit any of our websites, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and manage your preferences. Please note, that blocking some types of cookies may impact your experience of the site and the services we are able to offer.