متدها

Rust به شما این امکان را می‌دهد که توابعی را با تایپ جدید خود مرتبط کنید. این کار را با استفاده از بلوک impl انجام می‌دهید:

#[derive(Debug)]
struct Race {
    name: String,
    laps: Vec<i32>,
}

impl Race {
    // No receiver, a static method
    fn new(name: &str) -> Self {
        Self { name: String::from(name), laps: Vec::new() }
    }

    // Exclusive borrowed read-write access to self
    fn add_lap(&mut self, lap: i32) {
        self.laps.push(lap);
    }

    // Shared and read-only borrowed access to self
    fn print_laps(&self) {
        println!("ضبط {} دور برای {}:", self.laps.len(), self.name);
        for (idx, lap) in self.laps.iter().enumerate() {
            println!("Lap {idx}: {lap} sec");
        }
    }

    // Exclusive ownership of self
    fn finish(self) {
        let total: i32 = self.laps.iter().sum();
        println!("مسابقه {} به پایان رسید، کل زمان دور: {}", self.name, total);
    }
}

fn main() {
    let mut race = Race::new("جایزه بزرگ موناکو");
    race.add_lap(70);
    race.add_lap(68);
    race.print_laps();
    race.add_lap(71);
    race.print_laps();
    race.finish();
    // race.add_lap(42);
}

آرگومان‌های self "گیرنده" را مشخص می‌کنند - شیئی که متد بر روی آن عمل می‌کند. چندین گیرنده رایج برای یک متد وجود دارد:

  • self&: شیئی را از فراخواننده با استفاده از یک مرجع مشترک و غیرقابل تغییر قرض می‌گیرد. شیء می‌تواند بعداً دوباره استفاده شود.
  • mut self&: شیء را از فراخواننده با استفاده از یک مرجع منحصر به فرد و قابل تغییر قرض می‌گیرد. شی پس از آن نمی‌تواند دوباره استفاده شود تا زمانی که مرجع به پایان برسد.
  • self: مالکیت شیء را به عهده می‌گیرد و آن را از فراخواننده منتقل می‌کند. متد مالک شیء می‌شود. شیء هنگامی که متد باز می‌گردد حذف خواهد شد، مگر اینکه مالکیت آن به‌طور صریح منتقل شود. مالکیت کامل به‌طور خودکار به معنای قابلیت تغییر نیست.
  • mut self: مشابه مورد بالا، اما متد می‌تواند شیء را تغییر دهد.
  • بدون گیرنده: این تبدیل به یک متد استاتیک در ساختار می‌شود. معمولاً برای ایجاد سازنده‌ها استفاده می‌شود که به‌طور معمول new نامیده می‌شوند.
This slide should take about 8 minutes.

نکات کلیدی:

  • مفید است که متدها را با مقایسه آنها با توابع معرفی کنیم.
    • متدها بر روی یک نمونه از تایپی (مانند struct یا enum) فراخوانی می‌شوند، و پارامتر اول نمونه را به‌عنوان نمونه self.
    • توسعه‌دهندگان ممکن است تصمیم بگیرند از متدها استفاده کنند تا از نحو گیرنده متد بهره‌برداری کنند و به سازمان‌دهی بهتر کد کمک کنند. با استفاده از متدها، می‌توانیم تمامی کدهای پیاده‌سازی را در یک مکان قابل پیش‌بینی نگه داریم.
  • استفاده از کلمه کلیدی self، که به‌عنوان گیرنده متد عمل می‌کند، را مشخص کنید.
    • نشان دهید که self یک اصطلاح کوتاه‌شده برای self: Self است و شاید نشان دهید که چگونه نام struct نیز می‌تواند استفاده شود.
    • توضیح دهید که Self یک نام مستعار نوع برای تایپ است که بلوک impl در آن قرار دارد و می‌تواند در سایر بخش‌های بلوک استفاده شود.
    • Note how self is used like other structs and dot notation can be used to refer to individual fields.
    • این ممکن است زمان مناسبی باشد برای نشان دادن تفاوت بین self& و self با تلاش برای اجرای متد finish دو بار.
    • فراتر از حالت‌های مختلف self، تایپ‌های special wrapper types نیز وجود دارند که به‌عنوان تایپ‌های گیرنده مجاز هستند، مانند <Box<Self.