متدها
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
. - توسعهدهندگان ممکن است تصمیم بگیرند از متدها استفاده کنند تا از نحو گیرنده متد بهرهبرداری کنند و به سازماندهی بهتر کد کمک کنند. با استفاده از متدها، میتوانیم تمامی کدهای پیادهسازی را در یک مکان قابل پیشبینی نگه داریم.
- متدها بر روی یک نمونه از تایپی (مانند struct یا enum) فراخوانی میشوند، و پارامتر اول نمونه را بهعنوان نمونه
- استفاده از کلمه کلیدی
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
.
- نشان دهید که